You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 13/SDK 33访问相册的权限问题求助

问题分析

在Android 13(API 33)中,系统对媒体权限进行了拆分,READ_EXTERNAL_STORAGE权限不再用于访问相册图片,取而代之的是READ_MEDIA_IMAGES权限。你的代码错误地在API >=29时同时申请READ_EXTERNAL_STORAGE和READ_MEDIA_IMAGES,但在API33环境下,READ_EXTERNAL_STORAGE已被废弃且无法被授予,导致权限检查时areAllPermissionsGranted()返回false,最终无法打开相册。

解决方案

1. 修正权限申请逻辑

调整权限数组的判断条件,针对不同API版本申请对应权限:

case R.id.relativeLayoutEditor:
    String[] arrPermissionsEdit;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // API33及以上
        arrPermissionsEdit = new String[]{
            android.Manifest.permission.READ_MEDIA_IMAGES
        };
    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // API29-32
        arrPermissionsEdit = new String[]{
            android.Manifest.permission.READ_EXTERNAL_STORAGE
        };
    } else { // API28及以下
        arrPermissionsEdit = new String[]{
            android.Manifest.permission.READ_EXTERNAL_STORAGE,
            android.Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
    }

    Dexter.withContext(HomeActivity.this)
            .withPermissions(arrPermissionsEdit)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport multiplePermissionsReport) {
                    if (multiplePermissionsReport.areAllPermissionsGranted()) {
                        Intent intent = new Intent(Intent.ACTION_PICK);
                        intent.setType("image/*");
                        String[] mimetypes = {"image/*"};
                        intent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
                        startActivityForResult(intent, IMAGE_GALLERY_REQUEST);
                    }

                    if (multiplePermissionsReport.isAnyPermissionPermanentlyDenied()) {
                        DetailsDialog.showDetailsDialog(HomeActivity.this);
                    }
                }

                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> list, PermissionToken permissionToken) {
                    permissionToken.continuePermissionRequest();
                }
            })
            .withErrorListener(dexterError -> Toast.makeText(HomeActivity.this, "Error occurred! ", Toast.LENGTH_SHORT).show())
            .onSameThread()
            .check();
    return;

2. 完善Manifest权限声明

在AndroidManifest.xml中添加权限声明,并为旧权限设置maxSdkVersion,避免在高版本系统中出现无效权限申请:

<!-- 兼容API32及以下版本 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28" />

<!-- API33及以上版本访问相册图片 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

<!-- 相机权限(如果仍需要调用相机) -->
<uses-permission android:name="android.permission.CAMERA" />

3. 额外说明

  • Android 13中,CAMERA权限仅用于调用相机,与相册访问无关,无需在相册申请逻辑中包含该权限。
  • 若需访问视频或音频,需对应添加READ_MEDIA_VIDEO或READ_MEDIA_AUDIO权限。

内容的提问来源于stack exchange,提问作者DannyRoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:45:37