Android 13以下版本无法打开相册权限问题求助
解决Flutter Android 13以下版本相册权限异常问题
问题根源
Android 13(API 33)及以上采用READ_MEDIA_IMAGES权限访问相册,但Android 11(API 30)及以下版本需使用READ_EXTERNAL_STORAGE权限。你的AndroidManifest.xml仅声明了READ_MEDIA_IMAGES,导致低版本系统无法识别相册权限请求,权限状态始终返回denied或permanentlyDenied,进而触发跳转设置页的逻辑。
解决方案
1. 补全AndroidManifest.xml权限配置
在现有权限基础上,添加适配低版本的READ_EXTERNAL_STORAGE权限,并通过maxSdkVersion限定其仅作用于Android 13以下系统:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/> <!-- 适配Android 13以下版本的相册权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32"/>
同时,由于你的targetSdkVersion=33,需在<application>标签中添加Android 10分区存储兼容属性:
<application ... android:requestLegacyExternalStorage="true"> ... </application>
2. 优化权限请求逻辑
调整权限请求代码,细化状态判断,避免不必要的设置页跳转:
final PermissionStatus status = await Permission.photos.request(); if (status == PermissionStatus.granted) { // 权限已授予,执行打开相册逻辑 } else if (status == PermissionStatus.denied) { // 首次拒绝,提示用户授权必要性 ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text('需要相册权限才能访问图片')), ); } else if (status == PermissionStatus.permanentlyDenied) { // 永久拒绝时才引导至设置页 openAppSettings(); throw NoImageException("Photo gallery image permission is not granted"); }
3. 确保permission_handler版本兼容
升级permission_handler至最新稳定版(建议≥10.0.0),新版本已优化不同Android版本的权限映射逻辑:
flutter pub upgrade permission_handler
原理说明
- Android 13+:系统使用
READ_MEDIA_IMAGES权限,与Permission.photos直接对应。 - Android 11-12:
READ_EXTERNAL_STORAGE权限对应系统设置中的「文件和媒体」,开启后即可访问相册,permission_handler会自动将Permission.photos映射到该权限。 - Android 10及以下:
android:requestLegacyExternalStorage="true"可关闭分区存储限制,确保应用正常访问媒体文件。
内容的提问来源于stack exchange,提问作者Agung
相关产品推荐
相关产品推荐

