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

Flutter中WhatsApp .Statuses路径无法获取内容问题求助

问题解决:Android 11下无法读取WhatsApp .Statuses目录内容

核心原因

Android 11引入的Scoped Storage机制,限制了应用直接访问其他应用的私有媒体目录(包括WhatsApp的.Statuses目录)。即使申请了Permission.storage权限,也无法通过Directory.listSync()读取该目录内容——这是空列表的根本原因。同时,Android 11及以上版本中,Permission.storage仅能访问自身应用的存储目录,无法读取其他应用的媒体文件。

解决方案

1. 调整权限申请逻辑

针对Android版本适配权限类型,Android 11+需申请媒体读取权限替代原存储权限:

import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';

void getStatus(String ext) async {
  Permission permission;
  if (Platform.isAndroid) {
    final androidInfo = await DeviceInfoPlugin().androidInfo;
    if (androidInfo.version.sdkInt >= 30) { // Android 11及以上
      permission = ext == ".mp4" ? Permission.readMediaVideos : Permission.readMediaImages;
    } else {
      permission = Permission.storage;
    }
  } else {
    permission = Permission.storage;
  }

  final status = await permission.request();

  if (status.isDenied) {
    await permission.request();
    debugPrint("权限被拒绝");
    return;
  }

  if (status.isGranted) {
    await _fetchStatusesFromMediaStore(ext);
  }
}

2. 通过MediaStore查询状态文件

Scoped Storage下必须通过系统MediaStore API获取其他应用的媒体文件,推荐使用media_store包简化操作:

  • 先添加依赖到pubspec.yaml:

    dependencies:
      device_info_plus: ^9.0.0
      permission_handler: ^10.2.0
      media_store: ^1.1.0
    
  • 实现查询逻辑:

    Future<void> _fetchStatusesFromMediaStore(String ext) async {
      List<FileSystemEntity> items = [];
      final mediaStore = MediaStore();
      final queryPath = "%WhatsApp/Media/.Statuses/%$ext";
      List<MediaStoreFile> mediaFiles;
    
      if (ext == ".mp4") {
        mediaFiles = await mediaStore.getVideoFiles(
          query: MediaStoreQuery(
            where: "${MediaStoreColumns.DATA} LIKE ?",
            whereArgs: [queryPath],
          ),
        );
      } else {
        mediaFiles = await mediaStore.getImageFiles(
          query: MediaStoreQuery(
            where: "${MediaStoreColumns.DATA} LIKE ?",
            whereArgs: [queryPath],
          ),
        );
      }
    
      items = mediaFiles.map((file) => File(file.path)).toList();
    
      if (ext == ".mp4") {
        _getVideos = items;
      } else {
        _getImages = items;
      }
      _isWhatsappAvailable = items.isNotEmpty;
      notifyListeners();
    }
    

3. 配置AndroidManifest权限

在android/app/src/main/AndroidManifest.xml中添加对应权限:

<!-- Android 11+ 媒体权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<!-- Android 10及以下 存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

额外提示

WhatsApp状态文件为临时存储,仅保留24小时,且仅用户查看过的状态才会生成对应文件。

内容的提问来源于stack exchange,提问作者Malith Dilshan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 03:25:00