Google's VisionAPI example FaceTracker Camera

2019-07-15 06:57发布

问题:

I'm trying to run Google Vision FaceTracker but I have an error on one line of code in CameraSourcePreview.

This is the error - Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with checkPermission) or explicitly handle a potential SecurityException

And this is the function-

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

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

        //...other code

        mStartRequested = false;
    }
}

回答1:

It does seem that you are not getting the correct permissions that FaceTracker needs. For your needs just add the facetracker permissions into the below implementation and interface.

In our app we added an interface with a callback which handles all our permissions for us :

public interface PermissionAndPackageAvailabilityChecker {

    void checkCameraPermission(final PermissionResult callback);

    void checkFileIoPermission(final PermissionResult callback);

    interface PermissionResult {
        void hasPermission();

        void noPermission();
    }
}

The implementation is pretty simple :

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;
    }
}