在 Flutter 中访问 SD 卡(外部存储)需要使用 path_provider 和 permission_handler 插件来获取存储路径并请求权限。以下是具体步骤:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
path_provider: ^2.1.1
permission_handler: ^11.0.1
运行 flutter pub get 安装依赖。
2. 配置权限
Android
在 android/app/src/main/AndroidManifest.xml 中添加:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
对于 Android 10+,可能需要添加:
<application android:requestLegacyExternalStorage="true" ...>
iOS
iOS 不支持直接访问 SD 卡,只能访问应用沙盒目录。若需访问相册等,需添加:
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册</string>
3. 请求权限并获取路径
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
class SDCardAccess extends StatefulWidget {
@override
_SDCardAccessState createState() => _SDCardAccessState();
}
class _SDCardAccessState extends State<SDCardAccess> {
String? sdCardPath;
Future<void> getSDCardPath() async {
// 检查并请求存储权限
var status = await Permission.storage.status;
if (!status.isGranted) {
status = await Permission.storage.request();
}
if (status.isGranted) {
// 获取外部存储目录(通常是 SD 卡)
final directory = await getExternalStorageDirectories();
if (directory != null && directory.isNotEmpty) {
setState(() {
sdCardPath = directory.first.path; // 第一个路径通常是主外部存储
});
}
} else {
print("权限被拒绝");
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: getSDCardPath,
child: Text("获取 SD 卡路径"),
),
if (sdCardPath != null) Text("路径: $sdCardPath"),
],
),
),
);
}
}
注意事项:
- Android 差异:不同设备的外部存储路径可能不同,
getExternalStorageDirectories 返回多个路径,需根据需求选择。
- iOS 限制:无法直接访问 SD 卡,只能使用应用沙盒或系统相册。
- Android 11+:可能需要使用
MANAGE_EXTERNAL_STORAGE 权限,但需通过 Google Play 审核。
通过以上步骤,即可在 Flutter 中访问外部存储(SD 卡)。