我正在尝试运行Google Vision FaceTracker,但CameraSourcePreview中的一行代码却出错。

这是错误-
呼叫需要许可,而该许可可能会被用户拒绝:代码应显式检查以查看许可是否可用(使用checkPermission)或显式处理潜在的SecurityException

这是功能-

private void startIfReady() throws IOException {
    if (mStartRequested && mSurfaceAvailable) {

        mCameraSource.start(mSurfaceView.getHolder()); //Error

        //...other code

        mStartRequested = false;
    }
}

最佳答案

看来您没有获得FaceTracker所需的正确权限。根据您的需要,只需将facetracker权限添加到下面的实现和界面中。

在我们的应用程序中,我们添加了一个带有回调的接口,该接口为我们处理所有权限:

public interface PermissionAndPackageAvailabilityChecker {

    void checkCameraPermission(final PermissionResult callback);

    void checkFileIoPermission(final PermissionResult callback);

    interface PermissionResult {
        void hasPermission();

        void noPermission();
    }
}


实现非常简单:

public class DefaultPermissionAndPackage implements PermissionAndPackageAvailabilityChecker {

    private final Context mContext;

    @Inject
    public DefaultPermissionAndPackage(Context context) {
        mContext = context;
    }

    @Override
    public void checkCameraPermission(final PermissionResult callback) {
        int cameraPermission = checkPermission(mContext, Manifest.permission.CAMERA);
        if (checkHasPermission(cameraPermission)) {
            callback.hasPermission();
        } else {
            callback.noPermission();
        }
    }

    @Override
    public void checkFileIoPermission(PermissionResult callback) {
        // Check if we have write permission
        int permission = checkPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (checkHasPermission(permission)) {
            callback.hasPermission();
        } else {
            callback.noPermission();
        }
    }

    private int getTargetSdk(int defaultVersion) {
        int targetSdkVersion = defaultVersion;
        try {
            PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
            targetSdkVersion = packageInfo.applicationInfo.targetSdkVersion;

        } catch (PackageManager.NameNotFoundException ignored) {
            //Should not happen . . . I hope
        }
        return targetSdkVersion;
    }

    private int checkPermission(final Context context, final String permission) {
        int permissionResult = ActivityCompat.checkSelfPermission(context, permission);
        // this can probably be simplified but explains the logic around permissions nicely.
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1
                && getTargetSdk(Build.VERSION_CODES.LOLLIPOP_MR1) <= Build.VERSION_CODES.LOLLIPOP_MR1) {
            permissionResult = PermissionChecker.checkSelfPermission(context, permission);
            //Will check marshmallow here in the future
        }
        return permissionResult;
    }

    private boolean checkHasPermission(int permissionToCheck) {
        return permissionToCheck == PackageManager.PERMISSION_GRANTED;
    }
}

10-04 18:03