我正在尝试运行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;
}
}