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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:09:01