我正在请求多个权限(CAMERA、READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE),并且在执行此操作时仅显示 1 个权限对话框,而不是 3 个权限对话框。
这是代码片段。
private String[] PERMISSIONS;
PERMISSIONS = new String[] {
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.CAMERA) +ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) +ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
mCameraView.start();
} else if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) || ActivityCompat.shouldShowRequestPermissionRationale
(this, Manifest.permission.READ_EXTERNAL_STORAGE) ||
ActivityCompat.shouldShowRequestPermissionRationale
(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
ConfirmationDialogFragment
.newInstance(R.string.camera_permission_confirmation,
new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},
PERMISSIONS_MULTIPLE_REQUEST,
R.string.camera_permission_not_granted)
.show(getSupportFragmentManager(), FRAGMENT_DIALOG);
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!hasPermissions(MainActivity.this,PERMISSIONS)) {
ActivityCompat.requestPermissions(MainActivity.this,PERMISSIONS,PERMISSIONS_MULTIPLE_REQUEST);
}
}
}
private boolean hasPermissions(Context context, String... PERMISSIONS) {
if (context != null && PERMISSIONS != null) {
for (String permission: PERMISSIONS){
if (ActivityCompat.checkSelfPermission(context,permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case PERMISSIONS_MULTIPLE_REQUEST:
if (grantResults.length > 0) {
boolean cameraPermission = grantResults[1] == PackageManager.PERMISSION_GRANTED;
boolean readExternalFile = grantResults[0] == PackageManager.PERMISSION_GRANTED;
if (cameraPermission && readExternalFile) {
// write your logic here
} else {
Toast.makeText(this, R.string.camera_permission_not_granted,
Toast.LENGTH_SHORT).show();
Toast.makeText(this, R.string.gallary_permission_not_grated,
Toast.LENGTH_SHORT).show();
}
}
break;
}
}
我正在尝试请求所有三个权限,但是当打开一个对话框并且用户接受/拒绝该权限时,其余两个权限的权限对话框不会打开。并且 onRequestPermissionsResult 被多次调用,Toast 消息按照代码打印在屏幕上。
在 Android 13 上,READ_EXTERNAL_STORAGE 已被 READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 取代。
在AndroidManifest.xml中
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/>
在你的java文件中:
String[] permissions = new String[]{
Manifest.permission.READ_MEDIA_VIDEO,
Manifest.permission.READ_MEDIA_IMAGES,
Manifest.permission.CAMERA
};