Android新版本中permission_handler存储权限请求失效问题
Android 14(API 34)下Permission.storage请求无弹窗直接返回Denied的解决方案
问题核心原因
Android 14(API 34)对存储权限模型做了拆分,传统的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限已不再适用于媒体文件访问场景,且permission_handler 11.3.1中Permission.storage在API 33+设备上,实际映射的是MANAGE_EXTERNAL_STORAGE特殊权限——该权限无法通过弹窗请求,必须引导用户到系统设置手动开启。你当前调用Permission.storage.request()时,系统因无法触发该特殊权限的弹窗,直接返回PermissionStatus.denied。
解决方案
根据你的业务需求选择对应权限请求逻辑:
1. 访问媒体文件(图片/视频/音频)
如果你的需求是读取媒体文件,直接请求对应的媒体权限即可,无需使用Permission.storage:
- 图片:
Permission.photos(对应Manifest中已添加的READ_MEDIA_IMAGES) - 视频:
Permission.videos(对应READ_MEDIA_VIDEO) - 音频:
Permission.audio(对应READ_MEDIA_AUDIO)
修改调用代码:
// 示例:请求图片权限 await _requestPermission(Permission.photos);
2. 访问所有文件(非媒体场景)
如果确实需要访问设备上的所有文件(如下载目录的非媒体文件),则需处理MANAGE_EXTERNAL_STORAGE权限:
- 调用
Permission.storage.request()后,若返回PermissionStatus.denied,引导用户跳转到应用设置页面开启权限:
Future<bool> _requestPermission(Permission permission) async { if (await permission.isGranted) { return true; } else { var result = await permission.request(); if (result == PermissionStatus.denied) { // 引导用户到设置页面 await openAppSettings(); // 再次检查权限状态 result = await permission.status; } return result == PermissionStatus.granted; } }
注意:
MANAGE_EXTERNAL_STORAGE权限属于特殊权限,Google Play对该权限的审核非常严格,仅允许特定类型应用使用(如文件管理器类应用)。
额外优化建议
- 移除Manifest中冗余的
WRITE_EXTERNAL_STORAGE权限:Android 13+(API 33)写入媒体文件已无需该权限,仅在修改其他应用创建的媒体文件时才需额外申请。 - 针对不同Android版本做权限适配:可以通过
Platform.isAndroid结合设备信息工具类获取系统版本,动态选择对应的权限请求逻辑。
内容的提问来源于stack exchange,提问作者Devidas G
相关产品推荐
相关产品推荐

