Flutter外部存储访问插件external_storage的使用
Flutter外部存储访问插件external_storage的使用
external_storage简介

- 作者: 李俊才 (jcLee95)
- 博客: jcLee95
- 邮箱: 291148484@163.com
- 描述: 一个强大的Flutter Android外部存储管理插件,提供全面的文件系统操作、存储设备管理、文件监控和权限处理。
- 许可证: LICENSE
- 中文版: README_CN.md
简介
External Storage 是一款功能强大且易于使用的Flutter插件,专为跨平台文件和存储管理设计。该库提供了丰富的API来处理外部存储设备上的文件和目录操作,支持各种文件系统交互场景。
功能亮点
- 📱 多存储设备管理
- 📂 完整的文件和目录操作
- 👀 实时文件系统监控
- 🔒 全面的权限管理
- 🛠 丰富的文件实用方法
- ⚡ 高性能文件操作
- 🎯 类型安全的API
关键特性
External Storage 插件提供了丰富的文件和存储管理能力,包括但不限于:
- 文件操作:读取、写入、复制、移动和删除文件
- 目录管理:创建、列出、复制和监控目录
- 存储设备信息:检索详细的存储设备信息
- 文件系统监控:实时监听文件和目录的变化
- 权限管理:简化存储权限申请和管理
安装
在 pubspec.yaml 文件中添加以下依赖:
dependencies:
external_storage: ^最新版本
然后执行以下命令以获取Flutter包:
flutter pub get
或者直接使用以下命令安装最新版本:
flutter pub add external_storage
配置
在 AndroidManifest.xml 中添加以下权限:
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Android 13+ (API 33+) 精细存储权限 -->
<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 14+ (API 34+) 图片和视频访问权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_VISUAL_USER_SELECTED" />
<!-- Android 10及以下版本的存储权限 -->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="29" />
<!-- 全局文件访问权限(需要手动在系统设置中授权) -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<application
android:label="external_storage_example"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<!-- 文件提供者(可选) -->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
</application>
</manifest>
有关详细信息,请参考提供的示例项目。
基本用法
初始化
import 'package:external_storage/external_storage.dart';
final externalStorage = ExternalStorage();
存储设备信息
获取所有可用的存储设备:
Future<void> getStorageDevices() async {
try {
List<StorageDevice> devices = await externalStorage.getAllStorageDevices();
devices.forEach((device) {
print('设备路径: ${device.path}');
print('设备名称: ${device.name}');
print('总空间: ${device.totalSize} 字节');
print('可用空间: ${device.availableSize} 字节');
});
} catch (e) {
print('获取存储设备失败: $e');
}
}
文件操作
读取文件
Future<void> readFileContent() async {
try {
Uint8List fileData = await externalStorage.readFile('/path/to/file');
print('文件内容: $fileData');
} catch (e) {
print('读取文件失败: $e');
}
}
写入文件
Future<void> writeFileContent() async {
try {
Uint8List data = Uint8List.fromList('Hello, External Storage!'.codeUnits);
int bytesWritten = await externalStorage.writeFile('/path/to/file', data);
print('写入字节数: $bytesWritten');
} catch (e) {
print('写入文件失败: $e');
}
}
目录操作
列出目录内容
Future<void> listDirectoryContents() async {
try {
List<FileInfo> files = await externalStorage.listDirectory('/path/to/directory');
files.forEach((file) {
print('文件名: ${file.name}');
print('文件路径: ${file.path}');
print('文件大小: ${file.size} 字节');
});
} catch (e) {
print('列出目录内容失败: $e');
}
}
文件系统监控
监听文件系统事件
Future<void> watchDirectory() async {
try {
await externalStorage.startWatching(
'/path/to/watch',
recursive: true,
events: [
WatchEventType.create,
WatchEventType.delete,
WatchEventType.modify
],
);
externalStorage.registerWatchEventCallback((path, event) {
print('文件系统事件: $path, 事件类型: ${event.name}');
});
} catch (e) {
print('监听目录失败: $e');
}
}
权限管理
检查和请求存储权限
Future<void> manageStoragePermissions() async {
try {
bool hasPermission = await externalStorage.checkStoragePermissions();
if (!hasPermission) {
bool permissionGranted = await externalStorage.requestStoragePermissions();
if (permissionGranted) {
print('存储权限已授予');
} else {
print('存储权限被拒绝');
}
}
} catch (e) {
print('权限管理失败: $e');
}
}
高级功能
External Storage 提供了额外的高级功能,例如文件MD5计算、MIME类型检索、文件属性检查等。建议查阅API文档以获取更多详细信息。
注意事项
在使用 External Storage 时,请注意以下几点:
- 确保处理潜在的异常情况
- 使用文件和目录操作时遵循最佳实践
- 注意跨平台兼容性
- 在某些平台上可能需要额外的权限配置
许可证
该插件遵循MIT许可证。请参阅项目的许可证文件以获取详细信息。
贡献
欢迎通过GitHub仓库提交问题和拉取请求,共同改进 External Storage 插件。
示例代码
以下是完整的示例代码,展示了如何使用 external_storage 插件进行文件和目录操作:
import 'package:flutter/material.dart';
import 'package:external_storage/external_storage.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'External Storage Demo',
theme: ThemeData(primarySwatch: Colors.blue),
home: const StorageDemo(),
);
}
}
class StorageDemo extends StatefulWidget {
[@override](/user/override)
State<StorageDemo> createState() => _StorageDemoState();
}
class _StorageDemoState extends State<StorageDemo> {
final ExternalStorage _storage = ExternalStorage();
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('External Storage Demo')),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 获取存储设备信息
List<StorageDevice> devices = await _storage.getAllStorageDevices();
print('设备数量: ${devices.length}');
},
child: const Text('获取存储设备'),
),
),
);
}
}
更多关于Flutter外部存储访问插件external_storage的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter外部存储访问插件external_storage的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中,如果你想访问设备的外部存储(如SD卡或内部存储),可以使用 external_storage 插件。这个插件允许你读取和写入外部存储中的文件。以下是如何使用 external_storage 插件的详细步骤。
1. 添加依赖
首先,你需要在 pubspec.yaml 文件中添加 external_storage 插件的依赖:
dependencies:
flutter:
sdk: flutter
external_storage: ^1.0.3
然后运行 flutter pub get 来安装依赖。
2. 请求权限
在访问外部存储之前,你需要在 AndroidManifest.xml 文件中添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
对于 Android 6.0 (API level 23) 及以上版本,你还需要在运行时请求这些权限。你可以使用 permission_handler 插件来请求权限。
3. 使用 external_storage 插件
下面是一个简单的示例,展示如何使用 external_storage 插件来读取和写入外部存储中的文件。
导入插件
import 'package:external_storage/external_storage.dart';
获取外部存储路径
Future<String> getExternalStoragePath() async {
String path = await ExternalStorage.getExternalStoragePublicDirectory(
ExternalStorage.DIRECTORY_DOWNLOADS);
return path;
}
读取文件
Future<String> readFile(String fileName) async {
String path = await getExternalStoragePath();
File file = File('$path/$fileName');
return file.readAsString();
}
写入文件
Future<void> writeFile(String fileName, String content) async {
String path = await getExternalStoragePath();
File file = File('$path/$fileName');
await file.writeAsString(content);
}
4. 完整示例
以下是一个完整的示例,展示如何读取和写入外部存储中的文件。
import 'package:flutter/material.dart';
import 'package:external_storage/external_storage.dart';
import 'dart:io';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('External Storage Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
await writeFile('example.txt', 'Hello, World!');
print('File written');
},
child: Text('Write File'),
),
SizedBox(height: 20),
ElevatedButton(
onPressed: () async {
String content = await readFile('example.txt');
print('File content: $content');
},
child: Text('Read File'),
),
],
),
),
),
);
}
}
Future<String> getExternalStoragePath() async {
String path = await ExternalStorage.getExternalStoragePublicDirectory(
ExternalStorage.DIRECTORY_DOWNLOADS);
return path;
}
Future<String> readFile(String fileName) async {
String path = await getExternalStoragePath();
File file = File('$path/$fileName');
return file.readAsString();
}
Future<void> writeFile(String fileName, String content) async {
String path = await getExternalStoragePath();
File file = File('$path/$fileName');
await file.writeAsString(content);
}

