Android 13+系统Flutter应用相机无法使用问题求助
Android 13+ Flutter相机无法使用问题解决思路
核心问题分析
你遇到的Read memory card access denied报错,本质是存储权限适配问题——尽管相机权限已授予,但images_picker在拍照后访问/写入存储时,存在无效权限配置冲突或权限请求不完整的情况。
具体解决步骤
1. 清理AndroidManifest中无效/冗余权限
Android 13+对存储权限做了大幅调整,必须移除以下无效权限:
android.permission.MANAGE_EXTERNAL_STORAGE:仅系统级文件管理器应用需要,普通应用无法通过常规流程获取,且会干扰权限逻辑android.permission.WRITE_MEDIA_STORAGE、android.permission.READ_MEDIA_STORAGE:这两个权限在Android 13+中已被废弃,官方用分类型媒体权限替代
整理后权限配置参考:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.BLUETOOTH"/> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION"/> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <uses-feature android:name="android.hardware.camera" android:required="true" /> <!-- Android 13+ 官方媒体权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO"/>
2. 移除无效的分区存储兼容配置
Android 13+强制启用分区存储,android:requestLegacyExternalStorage="true"已完全失效,直接从<application>标签中删除该属性。
3. 补充完整的权限请求逻辑
仅请求相机权限不足以覆盖拍照后存储访问需求,需同时请求媒体相关权限:
// 同时请求相机和照片权限 PermissionStatus cameraStatus = await Permission.camera.request(); PermissionStatus photoStatus = await Permission.photos.request(); // 确保两个权限都已授予再调用相机 if (cameraStatus.isGranted && photoStatus.isGranted) { // 调用images_picker相机逻辑 final result = await ImagesPicker.openCamera( pickType: PickType.image, // 可选:指定应用私有目录作为保存路径,无需额外权限 savePath: (await getApplicationDocumentsDirectory()).path, ); }
4. 检查images_picker调用参数
- 避免指定外部存储的公共目录作为
savePath,若需保存到公共相册,无需手动指定路径,images_picker会自动通过MediaStore API处理 - 若上述步骤无效,可尝试升级
images_picker到最新稳定版,确认版本是否存在Android 13+适配漏洞
内容的提问来源于stack exchange,提问作者behnam
相关产品推荐
相关产品推荐

