Flutter使用permission_handler请求Android存储权限始终被拒如何解决
问题原因
你遇到的问题由两个核心错误导致:
1. Dart代码逻辑错误
你打印的权限状态是发起申请前查询的旧值,不是权限申请后的实际结果:
你先执行await Permission.storage.status拿到初始被拒的状态,发起申请后直接打印了这个旧值,自然始终返回denied。
2. Android版本权限适配错误
日志No android specific permissions needed for: 9里的9对应Permission.storage枚举值,说明你当前运行的设备系统版本是Android 13(API 33+):
- Android 13及以上版本废弃了
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限,Permission.storage申请会被系统直接忽略,需要申请媒体图片权限Permission.photos - 如果你配置了
MANAGE_EXTERNAL_STORAGE权限,该权限属于特殊权限,无法通过普通的request()方法申请,必须引导用户手动跳转到系统设置页开启
解决步骤
步骤1:修正Dart权限申请代码
区分Android版本申请对应权限,并且取申请后的最新状态判断:
_askPermission() async { if (io.Platform.isIOS) { var photosStatus = await Permission.photos.status; if (photosStatus.isDenied) { // 接收申请后的新状态 final newStatus = await Permission.photos.request(); print("Photos Permission Status: ${newStatus.toString()}"); } } else { Permission? needRequestPermission; // 区分Android版本 if (io.Platform.version >= 13) { needRequestPermission = Permission.photos; } else { needRequestPermission = Permission.storage; } final status = await needRequestPermission.status; if (status.isDenied) { final newStatus = await needRequestPermission.request(); print("Android Permission Status: ${newStatus.toString()}"); // 如果返回永久拒绝,引导用户去设置页 if (newStatus.isPermanentlyDenied) { await openAppSettings(); } } } }
步骤2:优化AndroidManifest配置
如果你的应用不需要访问所有公共目录,只是用来读取壁纸图片,可以删除MANAGE_EXTERNAL_STORAGE权限配置,调整存储权限声明如下:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:minSdkVersion="33" /> <uses-permission android:name="android.permission.SET_WALLPAPER" /> <uses-permission android:name="android.permission.INTERNET" /> <application android:requestLegacyExternalStorage="true" <!-- 其余配置保持不变 --> >
步骤3:特殊情况处理
如果你确实需要全文件访问权限(MANAGE_EXTERNAL_STORAGE),需要单独增加跳转逻辑:
// Android 11及以上需要全文件权限时调用 if (await Permission.manageExternalStorage.isDenied) { await openAppSettings(); }
内容的提问来源于stack exchange,提问作者perymerdeka
相关产品推荐
相关产品推荐

