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
相关产品推荐
相关产品推荐

