我正在使用M的Android许可。
在我活动中的应用程序中,我正在使用以下代码为Camera启动服务。
用于打开摄像机的代码
cameraManager.openCamera(frontFacingCameraId, stateCallback, null);
我检查了一些文档,发现无法在服务中请求许可,我需要在活动中请求许可。因此,我正在活动中寻求许可。
请求许可的活动
if (PermissionUtil.getCameraPermission(this)) {
Debug.d(TAG, "Camera Permission -- permission exsited");
performRecordingAction();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case PermissionUtil.SDK__CAMERA_PERMISSION:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Debug.d(TAG, "Granted -- Camera Permission");
performRecordingAction();
} else {
Debug.d(TAG, "Denied -- Camera Permission");
// permission denied, boo! Disable the
// functionality that depends on this permission.
}
break;
}
}
PermissionUtil
public static boolean getCameraPermission(Activity activity) {
Debug.d(TAG, "getCameraPermission");
int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);
if (permission != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) {
Debug.d(TAG, "Already Denied -- Camera Permission");
return false;
} else {
Debug.d(TAG, "Request Camera Permission");
ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, SDK__CAMERA_PERMISSION);
return false;
}
} else {
return true;
}
}
但是在以上行的服务中,它仍会因安全异常而引发错误。
有人可以建议我在哪里犯错吗?有什么方法可以请求服务的许可吗?
只需在清单文件中添加android:exported="true"
如下:
<activity
android:name="com.example.MainActivity"
android:label="Main"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" >
</action>
</intent-filter>
它将解决安全异常的问题。
有什么方法可以请求服务许可吗?
您无法从服务请求权限,因为您需要系统提供的回调的活动上下文。权限请求也从您的应用程序异步运行。另请参见requestPermissions() >>LINK:
中的文档此方法可以启动一项活动,允许用户选择授予和拒绝的权限。因此,您应该准备暂停和恢复您的活动。进一步,授予某些权限可能需要重新启动应用程序。在在这种情况下,系统将在重新创建活动堆栈之前将结果传递给onRequestPermissionsResult(int,String [],int [])。
服务只能在运行时检查他是否具有必需的权限,然后调整其行为。
由于需要在android SDK 23(及更高版本)中内联检查权限,因此您可以忽略shouldShowRequestPermissionRationale
(提示用户设置权限),而只需检查是否在之前授予了权限:
public boolean checkPermission(){
if (Build.VERSION.SDK_INT < 23) {
return true;
}
else {
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// if (ActivityCompat.shouldShowRequestPermissionRationale(this,
// android.Manifest.permission.CAMERA)) {
// PropmtForPermission();
//} else {
return false;
//}
}
else{
return true;
}
}
}