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

Flutter中MediaPicker在Android 13无法调用相册的问题求助

Android 13相册访问及加载状态异常解决思路

核心问题分析

仅Android 13出现相册无法打开、加载状态持续为true的问题,其他版本运行正常,结合代码逻辑与系统特性,核心排查方向集中在权限适配、异常处理完整性、插件兼容性三个维度。

具体解决步骤

  • 适配Android 13媒体权限
    Android 13将原READ_EXTERNAL_STORAGE权限拆分为READ_MEDIA_IMAGES、READ_MEDIA_VIDEO等细分权限,旧权限在Android 13上不再生效。需:

    1. 在AndroidManifest.xml中添加对应权限:
      <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
      
    2. 在调用相册选择前,动态请求该权限,确保权限已授予。
  • 完善加载状态重置逻辑
    当前代码仅在捕获PlatformException时重置加载状态,若用户取消图片选择、出现非PlatformException类型的异常,加载状态会一直保持true。需将setLoading(false)移至finally块,保证无论成功或失败都会执行:

    try {
      // 原有图片选择、上传逻辑
      File? image = await (MediaPicker.show(context, null, justReturnFile: true, hideVideo: true, oneByOne: true));
      if (image != null) {
        await getUserBLoC(context).setPictureProfile(
            file: image, companyId: getUserBLoC(context).getSelectedCompany()!.id);
        if (image.path.contains('.tecnotmp')) {
          image.delete();
        }
      }
    } on PlatformException catch (e) {
      // PlatformException异常处理
    } catch (e) {
      // 捕获其他类型异常
    } finally {
      getLoadingBLoC(context).setLoading(false);
    }
    
  • 验证MediaPicker插件的Android 13适配
    即使更新了插件,仍需确认插件是否完全支持Android 13的媒体权限模型:

    1. 查看插件官方文档或issue列表,确认是否存在Android 13下的已知问题;
    2. 测试插件是否能正确触发权限请求,以及选择图片后是否能正常返回文件对象。
  • 排查Scoped Storage限制影响
    Android 13强化了Scoped Storage机制,直接访问文件路径可能出现权限问题。若MediaPicker返回的文件路径无法正常访问,可尝试通过MediaStore API获取图片内容,或确认插件是否已适配Scoped Storage的文件访问方式。

  • 调试异步流程完整性
    断点调试MediaPicker.show()方法在Android 13下的执行情况:

    1. 确认用户取消选择时,方法是否正常返回null;
    2. 检查setPictureProfile异步操作是否存在未捕获的异常,导致后续代码未执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:10:35