Flutter如何实现外部SD卡读写?能否类似getExternalStorageDirectory()实现?
Flutter 实现外部SD卡读写操作
一、权限配置
Android平台需先配置存储权限并动态申请:
- 在
android/app/src/main/AndroidManifest.xml中添加权限:<!-- Android 12及以下 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- Android 13+ 媒体文件权限,若需操作任意文件需添加MANAGE_EXTERNAL_STORAGE --> <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" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> - 使用
permission_handler包动态申请权限,示例代码:import 'package:permission_handler/permission_handler.dart'; Future<bool> requestStoragePermissions() async { PermissionStatus status; if (await Permission.manageExternalStorage.isGranted) { return true; } else { status = await Permission.manageExternalStorage.request(); return status.isGranted; } }
二、获取真实外部SD卡路径
注意:path_provider的getExternalStorageDirectory()返回的是应用专属的外部存储目录(属于内部存储的外部分区,并非可移除SD卡)。要获取真实可移除SD卡路径,需使用getExternalStorageDirectories:
import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<Directory?> getExternalSDCardDirectory() async { final directories = await getExternalStorageDirectories(type: StorageDirectory.documents); if (directories == null || directories.isEmpty) return null; // 遍历目录,判断是否为可移除SD卡(通过路径特征,不同设备可能有差异) for (var dir in directories) { final path = dir.path; // 通常SD卡路径包含类似"/storage/XXXX-XXXX"的格式 if (path.contains('/storage/') && !path.contains('/emulated/')) { return dir; } } return null; }
三、文件读写操作示例
获取到SD卡目录后,即可用dart:io的File类完成创建、读写、修改操作:
// 创建并写入文件 Future<void> createAndWriteFile(Directory sdDir) async { final file = File('${sdDir.path}/test.txt'); await file.writeAsString('Hello, SD Card!'); } // 读取文件内容 Future<String> readFile(Directory sdDir) async { final file = File('${sdDir.path}/test.txt'); return await file.readAsString(); } // 修改文件内容(追加) Future<void> appendToFile(Directory sdDir) async { final file = File('${sdDir.path}/test.txt'); await file.writeAsString('\nAdded new content!', mode: FileMode.append); }
注意事项
- Android 10+ 启用了分区存储(Scoped Storage),若未申请
MANAGE_EXTERNAL_STORAGE权限,仅能操作应用专属目录及媒体文件。 - iOS平台无传统意义上的可移除SD卡,外部存储仅沙盒内的共享目录,无需额外权限。
内容的提问来源于stack exchange,提问作者Jaafar Melhem
相关产品推荐
相关产品推荐

