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

Flutter实现Android WORLD_READABLE功能:跨应用文件读取方案问询

在Flutter中实现全局可读文件(替代Android废弃的WORLD_READABLE)

先明确:Android从API 17就标记WORLD_READABLE为废弃,API 29(Android 10)后更是收紧了存储权限,所以得按当前Android规则来实现跨应用文件读取,具体方案如下:

1. 选对存储目录

path_provider提供的私有目录(比如getApplicationDocumentsDirectory())是应用独占的,其他应用无法访问,必须使用外部公共存储目录:

  • 调用getExternalStoragePublicDirectory(DirectoryDownloads)获取系统公共下载目录,这是跨应用访问文件的基础(需配合权限)。
  • 注意:Android 10+启用了分区存储,getExternalStoragePublicDirectory()虽能继续使用,但官方推荐通过MediaStore管理公共文件,适配长期趋势。

2. 配置Android权限

在android/app/src/main/AndroidManifest.xml中添加必要权限:

<!-- Android 10及以下写外部存储需要 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- Android 11+读公共目录文件需要 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!-- Android 13+读媒体文件需细分权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />

如果是Android 10+想临时绕过分区存储限制,在<application>标签内添加:

android:requestLegacyExternalStorage="true"

但这只是过渡方案,长期建议适配分区存储规则。

3. 写入时设置全局可读权限

即使文件放在公共目录,默认创建的文件权限仍为应用私有,需手动修改:

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

Future<void> writeSharedFile() async {
  final publicDir = await getExternalStoragePublicDirectory(DirectoryDownloads);
  if (publicDir == null) return;
  
  final file = File('${publicDir.path}/hello.txt');
  await file.writeAsString('Hello from App A');
  
  // 设置权限为全局可读(对应Linux权限0644:所有者可读写,其他应用只读)
  await file.setPermissions(permissions: 0644);
}

若Android 10+下setPermissions()不生效,可改用MediaStore插入文件——这种方式创建的文件自动对其他应用可见。Flutter原生API对MediaStore支持有限,可通过MethodChannel调用Android原生代码,或使用media_store第三方库简化操作。

4. 应用B读取文件的方法

应用B需先申请读取权限,再通过以下方式访问文件:

Future<String?> readSharedFile() async {
  final publicDir = await getExternalStoragePublicDirectory(DirectoryDownloads);
  if (publicDir == null) return null;
  
  final file = File('${publicDir.path}/hello.txt');
  return await file.exists() ? file.readAsString() : null;
}

关于path_provider的说明

path_provider仅负责提供目录路径,没有直接设置文件全局可读的参数,权限需通过dart:io的File.setPermissions()或原生层配置。


内容的提问来源于stack exchange,提问作者Gabriele Pisapia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:41:06