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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:16:21