Android 13(Pixel 7)上FilePicker缺失权限问题求助
Android 13调用FilePicker权限拒绝异常解决方案
问题背景
此前版本Android运行无异常,但在Android 13(Pixel 7设备)上调用FilePicker时抛出以下异常:
PlatformException (PlatformException(read_external_storage_denied, User did not allow reading external storage, null, null))
调用代码:
final result = await FilePicker.platform.pickFiles( type: Platform.isAndroid ? FileType.any : FileType.custom, allowedExtensions: Platform.isAndroid ? null : ['bin', 'nano']);
已在app/src/main/AndroidManifest.xml中添加<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>权限,但问题未解决。
可行解决方案
1. 适配Android 13的权限细分机制
Android 13(API 33)将原有的READ_EXTERNAL_STORAGE拆分为媒体类型专属权限,若targetSdkVersion设为33或更高,需要在AndroidManifest.xml中添加新权限并兼容旧版本:
<!-- 仅对Android 12及以下生效的旧权限 --> <uses-permission android:name="android.permission.READ_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" />
2. 动态申请权限
即使Manifest声明了权限,仍需在代码中主动申请。可以用permission_handler包处理:
- 先添加依赖到
pubspec.yaml:
dependencies: permission_handler: ^10.2.0 # 建议使用最新稳定版
- 在调用FilePicker前检查并申请权限:
import 'package:permission_handler/permission_handler.dart'; Future<bool> checkAndRequestPermissions() async { if (Platform.isAndroid) { // 检查现有权限状态 if (await Permission.photos.isGranted && await Permission.videos.isGranted && await Permission.audio.isGranted) { return true; } // 批量申请权限 final statuses = await [ Permission.photos, Permission.videos, Permission.audio, ].request(); // 判断是否全部授权 return statuses[Permission.photos]!.isGranted && statuses[Permission.videos]!.isGranted && statuses[Permission.audio]!.isGranted; } return true; } // 调用FilePicker前先确认权限 final hasPermission = await checkAndRequestPermissions(); if (hasPermission) { final result = await FilePicker.platform.pickFiles( type: Platform.isAndroid ? FileType.any : FileType.custom, allowedExtensions: Platform.isAndroid ? null : ['bin', 'nano']); } else { // 处理用户拒绝权限的逻辑,比如提示开启权限 }
3. 更新FilePicker到最新版本
旧版本的file_picker可能未适配Android 13的权限规则,更新依赖到最新稳定版:
dependencies: file_picker: ^5.0.0 # 请替换为当前最新版
4. 非媒体文件的特殊处理
如果选择的是非媒体文件(如.bin、.nano),Android 13不需要额外存储权限,系统文件选择器会自动处理文件访问,确保调用FileType.any或对应自定义类型时参数正确即可。
内容的提问来源于stack exchange,提问作者Stéphane de Luca
相关产品推荐
相关产品推荐

