Android 11及以上Flutter无需MANAGE_EXTERNAL_STORAGE权限实现文件读写
不用MANAGE_EXTERNAL_STORAGE权限实现Flutter文件转换应用的方案
完全可以不依赖MANAGE_EXTERNAL_STORAGE权限实现你的需求,且全程用纯Flutter代码完成,核心是利用系统文件选择器处理文件和目录访问,绕开特殊权限申请。以下是对应功能的具体实现:
1. 允许用户选择保存目录
使用file_picker包的getDirectoryPath方法调用系统原生目录选择器,用户可自由选择外部存储的任意目录(如Downloads、Documents等),该操作无需特殊权限。
先在pubspec.yaml添加依赖:
dependencies: file_picker: ^6.1.1 # 使用最新稳定版
实现代码:
import 'package:file_picker/file_picker.dart'; Future<String?> selectSaveDirectory() async { // 唤起系统目录选择器 String? selectedDir = await FilePicker.platform.getDirectoryPath(); return selectedDir; }
2. 读取待转换文件
同样用file_picker的pickFiles方法选择单个文件,Android 10及以上无需申请READ_EXTERNAL_STORAGE权限(系统文件选择器会代为处理权限),Android 9及以下只需在AndroidManifest.xml添加静态权限声明,无需动态申请。
实现代码:
import 'dart:io'; import 'package:file_picker/file_picker.dart'; Future<File?> pickInputTextFile() async { FilePickerResult? result = await FilePicker.platform.pickFiles( type: FileType.custom, allowedExtensions: ['txt'], // 限制选择txt格式文件 ); if (result != null) { return File(result.files.single.path!); } return null; }
AndroidManifest.xml配置(仅Android 9及以下需要):
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
3. 保存转换后的文件到选定目录
拿到用户选择的目录路径后,直接用Dart的dart:io库创建文件并写入转换后的内容即可。通过系统文件选择器获取的目录路径,Flutter拥有合法写入权限,无需额外授权。
假设已完成txt转pdf逻辑并得到pdf字节数据,保存代码示例:
import 'dart:io'; import 'dart:typed_data'; Future<bool> savePdfFile(String saveDir, Uint8List pdfBytes, String fileName) async { try { final savePath = '$saveDir/$fileName'; final file = File(savePath); await file.writeAsBytes(pdfBytes); return true; } catch (e) { print('保存失败: $e'); return false; } }
关键注意事项
- 确保使用最新版
file_picker,避免兼容性问题; - 不要在代码中申请
MANAGE_EXTERNAL_STORAGE权限,否则Google Play仍会拒绝审核; - Android 11+分区存储机制下,通过系统文件选择器获取的路径合法,无需担心权限限制;
- 测试时覆盖不同Android版本(如Android 10、12、13),确保功能正常。
内容的提问来源于stack exchange,提问作者I.A.
相关产品推荐
相关产品推荐

