Android 11环境下Flutter应用如何读取其他应用的存储数据?
确实是Android 11引入的分区存储机制导致的,从API 30开始,requestLegacyExternalStorage属性会被系统忽略,普通存储权限无法访问其他应用在Android目录下的专属文件,必须申请所有文件访问权限才能读取,具体修改步骤如下:
1. 修正AndroidManifest.xml配置
在原有配置基础上补充适配高版本的权限声明:
<!-- 原有权限保留,新增以下适配API33+的权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- 给原有READ_EXTERNAL_STORAGE添加maxSdkVersion限制 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
2. 修正权限请求逻辑
你当前只申请了普通存储权限,Android 11及以上需要申请MANAGE_EXTERNAL_STORAGE权限,该权限不会弹出普通授权弹窗,会直接跳转到系统设置页让用户手动开启,修改后的代码如下:
import 'package:device_info_plus/device_info_plus.dart'; void _grantPermission() async { bool isGranted = false; final deviceInfo = DeviceInfoPlugin(); final androidInfo = await deviceInfo.androidInfo; final sdkInt = androidInfo.version.sdkInt; if (sdkInt >= 33) { // Android 13及以上,先申请媒体权限,再申请所有文件访问权限 var mediaStatus = await [ Permission.manageExternalStorage, Permission.readMediaImages, Permission.readMediaVideos, ].request(); isGranted = mediaStatus[Permission.manageExternalStorage]?.isGranted == true && mediaStatus[Permission.readMediaImages]?.isGranted == true && mediaStatus[Permission.readMediaVideos]?.isGranted == true; } else if (sdkInt >= 30) { // Android 11/12,申请所有文件访问权限 var manageStatus = await Permission.manageExternalStorage.request(); isGranted = manageStatus.isGranted; } else { // Android 10及以下,用普通存储权限 var storageStatus = await Permission.storage.request(); isGranted = storageStatus.isGranted; } if (isGranted) { _getData(); } else { // 可自行添加提示,引导用户手动开启权限 } setState(() { mainStatus = isGranted; }); }
注:上述代码需要提前引入device_info_plus和permission_handler依赖
3. 修正文件路径
你当前写的路径缺少开头的根目录斜杠,会被系统识别为相对路径,改为绝对路径即可:
var files = Directory("/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses") .listSync(recursive: true); print(files);
注意事项
如果你的应用需要上架Google Play,使用MANAGE_EXTERNAL_STORAGE权限需要向Google说明合理的使用场景,只有文件管理类、备份类等特定用途的应用才能通过审核,不符合要求的应用会被拒登。
内容的提问来源于stack exchange,提问作者LovinduLI
相关产品推荐
相关产品推荐

