Flutter Multi image picker2在Android14授权后仍存权限拒绝问题
问题描述
在Flutter项目中使用multi_image_picker2包实现从设备选择多张图片或视频的功能,该功能在旧版Android系统上运行正常,但在Android 14上无法正常工作。已在AndroidManifest.xml配置所有相关访问权限,权限状态显示已授予,但调用该包时仍收到权限被拒绝的错误提示。
AndroidManifest权限配置
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA" /> <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"/> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO"/> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
资源加载代码
Map<Permission, PermissionStatus> statuses = await [ Permission.photos, Permission.videos, Permission.storage ].request(); var photos = statuses[Permission.photos]; var videos = statuses[Permission.videos]; var storage = statuses[Permission.videos]; // 此处存在笔误,应为Permission.storage debugPrint(photos.toString()); debugPrint(videos.toString()); debugPrint(storage.toString()); if (photos!.isGranted || videos!.isGranted) { ref .read(profileSettingsProvider.notifier) .loadAssets(context, ref); } else { openAppSettings(); } Future<void> loadAssets(BuildContext context, WidgetRef ref) async { List<Asset> resultList = <Asset>[]; String errorText = 'No Error Detected'; try { resultList = await MultiImagePicker.pickImages( maxImages: 8, enableCamera: true, selectedAssets: ref.read(selectedImagesProvider.notifier).state, cupertinoOptions: CupertinoOptions( takePhotoIcon: "chat", doneButtonTitle: AppLocalizations.of(context).save, ), materialOptions: const MaterialOptions( actionBarColor: "#EA5D43", actionBarTitle: "APP NAME", statusBarColor: "#EA5D43", allViewTitle: "All Photos", useDetailsView: false, selectCircleStrokeColor: "#000000", ), ); } on Exception catch (e) { errorText = e.toString(); } }
解决方案
1. 修正代码笔误并优化权限判断
- 修复权限状态读取笔误:将
var storage = statuses[Permission.videos];改为var storage = statuses[Permission.storage];,避免日志输出错误。 - 调整权限判断逻辑:若需同时访问图片和视频,将条件改为
photos.isGranted && videos.isGranted;若只需其中一种,保留||但确保对应权限确实已授予。
2. 适配Android 14权限模型
Android 14对媒体权限做了细分,需调整权限声明:
- 为旧版存储权限添加
maxSdkVersion,仅在Android 12及以下生效:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
- 移除
MANAGE_EXTERNAL_STORAGE权限,该权限仅用于特殊文件管理场景,普通媒体选择无需申请,会干扰权限逻辑。
3. 升级或替换multi_image_picker2包
- 检查
multi_image_picker2的最新版本,尝试升级到最新版,确认是否修复了Android 14的兼容性问题。 - 若升级无效,替换为维护更活跃的媒体选择器包,如支持多选的
image_picker新版本,这些包通常更快适配系统版本变更。
4. 验证包内权限处理逻辑
如果上述步骤无效,排查multi_image_picker2的Android原生代码:
- 确认包内是否在Android 14环境下正确请求
READ_MEDIA_IMAGES和READ_MEDIA_VIDEO权限,而非仍依赖旧的READ_EXTERNAL_STORAGE。 - 可尝试在原生层手动请求权限后再调用选择器,验证是否为包内权限逻辑问题。
内容的提问来源于stack exchange,提问作者Sabbir33
相关产品推荐
相关产品推荐

