Android 13下Flutter存储权限异常:Permission.storage无法发起权限申请
Android 13下Permission Handler申请存储权限不弹弹窗的解决方案
问题原因
Android 13(API 33)重构了存储权限体系,原有的WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限不再适用于该版本及以上系统,直接调用Permission.storage.request()会被系统判定为无效请求,从而直接跳转至应用设置页面,而非弹出权限申请弹窗。
解决步骤
更新AndroidManifest.xml权限配置
针对不同版本的Android系统配置对应权限,低版本保留原有权限并限定生效范围,Android 13及以上添加新的媒体权限:<!-- 仅对Android 12及以下生效的传统存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <!-- 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" />调整Flutter端权限请求逻辑
根据Android系统版本动态选择要请求的权限,避免在Android 13+环境下请求已废弃的Permission.storage:import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; Future<void> requestMediaPermissions() async { final androidInfo = await DeviceInfoPlugin().androidInfo; final isAndroid13Plus = androidInfo.version.sdkInt >= 33; Permission targetPermission; if (isAndroid13Plus) { // 根据业务场景选择对应权限:图片用Permission.photos,视频用Permission.videos,音频用Permission.audio targetPermission = Permission.photos; } else { targetPermission = Permission.storage; } final permissionStatus = await targetPermission.request(); switch (permissionStatus) { case PermissionStatus.granted: // 权限已授予,执行后续存储操作 break; case PermissionStatus.denied: // 提示用户权限被拒绝,可再次请求 break; case PermissionStatus.permanentlyDenied: // 权限被永久拒绝,引导用户前往设置页面开启 await openAppSettings(); break; default: break; } }额外注意事项
- 确保
permission_handler包版本不低于v10.0.0,新版本已适配Android 13的权限模型; - Android 13中写入媒体文件无需单独申请权限,使用
MediaStoreAPI向公共媒体库写入或向应用专属目录写入时,系统会自动授权。
- 确保
内容的提问来源于stack exchange,提问作者shakti goyal
相关产品推荐
相关产品推荐

