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

