Flutter开发的WhatsApp状态保存App在Android 10及以上系统无法运行如何解决?
问题原因
- Android 10(API 级别 29)及以上系统引入了分区存储机制,默认禁止应用直接访问公共存储目录的任意路径。你之前申请的
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE权限在Android 10+上仅能访问媒体库的公共分类(图片、视频、音频),无法直接访问/storage/emulated/0/WhatsApp/Media/.Statuses这类第三方应用目录下的隐藏文件夹。 - Android 11(API 级别 30)进一步收紧了存储权限,普通应用的常规运行时权限申请无法获取公共目录全访问权限,也不能直接访问其他应用的专属目录内容。
- 写死的路径存在适配缺陷:新版WhatsApp已将数据存储路径迁移到
/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses,原路径仅旧版WhatsApp使用,双开、特殊定制ROM也可能修改默认存储路径。
解决方案
1. 适配Android 10 临时兼容方案
修改AndroidManifest.xml的application节点,添加requestLegacyExternalStorage属性,临时停用分区存储兼容旧逻辑:
<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="29" /> <application android:requestLegacyExternalStorage="true" ... 其他原有配置不变 > </application>
注意:该属性仅在Android 10设备上生效,Android 11及以上系统会自动忽略该配置
2. 适配Android 11及以上系统
- 首先在
AndroidManifest.xml中新增所有文件访问权限声明:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
- 该权限无法通过常规运行时权限申请流程获取,需要在Flutter代码中判断系统版本,当系统为Android 11及以上时,引导用户跳转到系统设置页面手动开启「所有文件访问权限」。
如果你的应用需要上架Google Play,需要向平台说明应用核心功能必须依赖该权限才能实现WhatsApp状态保存,否则会被拒审
3. 修正路径判断逻辑
不要写死单一存储路径,按优先级判断目录是否存在:
- 优先判断新版WhatsApp路径:
/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses - 其次判断旧版WhatsApp路径:
/storage/emulated/0/WhatsApp/Media/.Statuses - 如果需要支持WhatsApp商业版,额外判断
com.whatsapp.w4b对应的同名路径。
修改后的目录判断代码参考:
Directory? getStatusDir() { final List<String> candidatePaths = [ '/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses', '/storage/emulated/0/WhatsApp/Media/.Statuses', ]; for (final path in candidatePaths) { final dir = Directory(path); if (dir.existsSync()) { return dir; } } return null; } // 页面逻辑中使用 final Directory? _videoDir = getStatusDir(); if (_videoDir == null) { return Column( mainAxisAlignment: MainAxisAlignment.center, children: const [ Text( '未检测到可用的WhatsApp状态目录\n', style: TextStyle(fontSize: 18.0), ), Text( "请确认已安装正常版本的WhatsApp并已授予存储权限", style: TextStyle(fontSize: 18.0), ), ], ); } else { return VideoGrid(directory: _videoDir); }
4. 补充分版本权限申请逻辑
使用permission_handler等Flutter权限插件,针对不同系统版本申请对应权限:
- Android 9及以下:申请
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE - Android 10:申请上述存储权限即可,配合
requestLegacyExternalStorage配置 - Android 11及以上:先申请普通存储权限,再引导用户开启
MANAGE_EXTERNAL_STORAGE权限
内容的提问来源于stack exchange,提问作者Radiant Developers
相关产品推荐
相关产品推荐

