所以这个全新的 Android 运行时权限让我很困惑。我的应用程序当前正在编译并定位版本 23,这意味着我必须使用运行时权限。我的应用程序主要使用相机 api,它需要相机权限,因此我在打开相机之前添加了运行时权限,如下所示:
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED)
{//ask permissions for camera
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA},
CameraPermissions);
}
else
{//permissions attained now you can open the camera
camera=Camera.open(getCid());
camera.setPreviewCallback(this);
initPreview(width, height);
startPreview();
startTimer();
}
我还检查何时停止相机:
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED) {
camera.setPreviewCallback(null);
camera.release();
faceProc.release();
faceProc = null;
camera = null;
inPreview = false;
cameraConfigured = false;
}
权限请求的处理方式如下:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case CameraPermissions: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
StartUpCam();
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("How is this app going to work if you rejected the camera permission.... DUHHHH!!")
.setTitle("Rejected");
builder.setPositiveButton("Exit App", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//close application
closeApp();
}
});
AlertDialog dialog = builder.create();
dialog.show();
}
return;
}
}
}
因此,当发出请求时,它会调用 StartUpCam,然后在授予权限的情况下尝试打开摄像头。所以我的问题来了,如果我添加这个运行时权限检查,这会如何影响低于 6.0 的 Android 设备?那么5.0.1版本的手机也会提示给予拍照权限吗?如果我使用运行时权限,是否必须删除清单文件中的相机权限?目前,我将相机权限以及运行时权限保留在清单中,我不知道这是否正确。如果我降低目标并将 sdk 编译为 22 而不是 23,6.0 以上的 Android 设备将无法下载我的应用程序吗?如果我将其降低到版本 22,那么我就可以避免所有这些令人头疼的事情......