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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:07:43