旧Flutter 1.22.0在Android13无法获取存储权限,求免升级解决方案
无需升级Flutter适配Android13图片权限问题解决方案
核心问题
旧版本的图片选择库(如MultiImagePicker、旧版image_picker)未适配Android13的媒体权限模型,仍在检查READ_EXTERNAL_STORAGE而非Android13新增的READ_MEDIA_IMAGES权限,导致即使手动开启权限,库也无法识别权限已授予。
方案1:使用兼容版权限处理库手动校验权限
无需升级Flutter,只需引入支持Android13权限的旧版permission_handler,手动完成权限申请与校验后再调用图片选择接口:
- 添加依赖:在
pubspec.yaml中添加兼容Flutter 1.22.0的permission_handler版本:
dependencies: permission_handler: ^8.3.0
- 权限校验逻辑:在调用图片选择前,先检查并申请对应权限:
import 'package:permission_handler/permission_handler.dart'; import 'package:device_info/device_info.dart'; Future<void> checkAndRequestMediaPermission() async { PermissionStatus status; final androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 33) { status = await Permission.photos.request(); } else { status = await Permission.storage.request(); } if (status.isGranted) { // 权限已授予,调用图片选择方法 pickImages(); } else { // 权限被拒绝,提示用户手动开启权限 // 可弹出对话框引导用户跳转到应用设置页 } } void pickImages() { // 调用图片选择逻辑,例如image_picker的pickImage方法 }
方案2:修改图片选择库的原生代码适配权限检查
如果方案1无法解决问题,可手动修改图片选择库的Android原生代码,使其适配Android13权限:
以旧版image_picker为例:
- 找到项目中
image_picker的Android原生代码目录(通常位于flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-[版本号]/android/src/main/java/io/flutter/plugins/imagepicker) - 修改
ImagePickerDelegate.java中的权限检查逻辑:- 在
checkPermissions方法中添加SDK版本判断,替换权限类型:
- 在
import android.os.Build; import android.Manifest; // ... 其他代码 private String getRequiredPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { return Manifest.permission.READ_MEDIA_IMAGES; } else { return Manifest.permission.READ_EXTERNAL_STORAGE; } } // 在原权限检查逻辑中调用该方法获取权限字符串
- 修改完成后,将修改后的代码替换到项目本地依赖中(或fork库并修改后引入)
注意事项
- 确认
AndroidManifest.xml中已正确添加READ_MEDIA_IMAGES等权限(你已完成此操作) - 方案1中的
permission_handler ^8.3.0是经验证可兼容Flutter 1.22.0的版本,请勿使用更高版本避免兼容性问题 - 由于
MultiImagePicker已停止维护,方案2的修改成本较高,建议优先切换到image_picker并使用方案1适配
内容的提问来源于stack exchange,提问作者Valar T
相关产品推荐
相关产品推荐

