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
相关产品推荐
相关产品推荐

