You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 修正路径判断逻辑

不要写死单一存储路径,按优先级判断目录是否存在:

  1. 优先判断新版WhatsApp路径:/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses
  2. 其次判断旧版WhatsApp路径:/storage/emulated/0/WhatsApp/Media/.Statuses
  3. 如果需要支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 02:09:05