Android 13 更新后未显示多个权限请求对话框

问题描述 投票:0回答:2

我正在请求多个权限(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 permissions dialog android-permissions
2个回答
0
投票

正如官方文档中提到的,从Android 11开始,

WRITE_EXTERNAL_STORAGE
权限不再授予任何进一步的访问权限。

因此,如果您尝试请求

WRITE_EXTERNAL_STORAGE
,它总是在内部返回 false。因此,您必须完全绕过权限检查/请求。

请查看精细的媒体权限

如果您的应用面向 Android 13 或更高版本并且需要访问媒体 其他应用程序创建的文件,您必须请求一个或多个 以下细化媒体权限而不是 READ_EXTERNAL_STORAGE 权限:

作为替代方案,您还可以使用照片选择器


0
投票

在 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
};
© www.soinside.com 2019 - 2024. All rights reserved.