Flutter中MediaPicker在Android 13无法调用相册的问题求助
Android 13相册访问及加载状态异常解决思路
核心问题分析
仅Android 13出现相册无法打开、加载状态持续为true的问题,其他版本运行正常,结合代码逻辑与系统特性,核心排查方向集中在权限适配、异常处理完整性、插件兼容性三个维度。
具体解决步骤
适配Android 13媒体权限
Android 13将原READ_EXTERNAL_STORAGE权限拆分为READ_MEDIA_IMAGES、READ_MEDIA_VIDEO等细分权限,旧权限在Android 13上不再生效。需:- 在
AndroidManifest.xml中添加对应权限:<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> - 在调用相册选择前,动态请求该权限,确保权限已授予。
- 在
完善加载状态重置逻辑
当前代码仅在捕获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的媒体权限模型:- 查看插件官方文档或issue列表,确认是否存在Android 13下的已知问题;
- 测试插件是否能正确触发权限请求,以及选择图片后是否能正常返回文件对象。
排查Scoped Storage限制影响
Android 13强化了Scoped Storage机制,直接访问文件路径可能出现权限问题。若MediaPicker返回的文件路径无法正常访问,可尝试通过MediaStore API获取图片内容,或确认插件是否已适配Scoped Storage的文件访问方式。调试异步流程完整性
断点调试MediaPicker.show()方法在Android 13下的执行情况:- 确认用户取消选择时,方法是否正常返回null;
- 检查
setPictureProfile异步操作是否存在未捕获的异常,导致后续代码未执行。
内容的提问来源于stack exchange,提问作者Fabio Ferreira
相关产品推荐
相关产品推荐

