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