在Flutter中保存图片和视频可以通过以下方式实现:
保存图片
1. 使用 image_gallery_saver 插件(推荐)
import 'package:image_gallery_saver/image_gallery_saver.dart';
// 保存网络图片
Future<void> saveNetworkImage(String url) async {
var response = await Dio().get(
url,
options: Options(responseType: ResponseType.bytes),
);
final result = await ImageGallerySaver.saveImage(
Uint8List.fromList(response.data),
quality: 100,
name: "my_image",
);
print(result);
}
// 保存本地图片文件
Future<void> saveLocalImage(File imageFile) async {
final result = await ImageGallerySaver.saveFile(imageFile.path);
print(result);
}
2. 使用 path_provider 和 dart:io
import 'package:path_provider/path_provider.dart';
Future<File> saveImageToAppDir(Uint8List imageData) async {
final directory = await getApplicationDocumentsDirectory();
final imagePath = '${directory.path}/my_image.png';
return File(imagePath).writeAsBytes(imageData);
}
保存视频
使用 gallery_saver 插件
import 'package:gallery_saver/gallery_saver.dart';
// 保存网络视频
Future<void> saveNetworkVideo(String videoUrl) async {
await GallerySaver.saveVideo(videoUrl)
.then((bool? success) {
print('Video saved: $success');
});
}
// 保存本地视频文件
Future<void> saveLocalVideo(String filePath) async {
await GallerySaver.saveVideo(filePath, albumName: "My Videos")
.then((bool? success) {
print('Video saved: $success');
});
}
权限配置
Android 权限 (android/app/src/main/AndroidManifest.xml)
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
iOS 权限 (ios/Runner/Info.plist)
<key>NSPhotoLibraryAddUsageDescription</key>
<string>需要保存图片到相册</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册</string>
完整示例
import 'package:flutter/material.dart';
import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'package:permission_handler/permission_handler.dart';
class MediaSaver extends StatelessWidget {
Future<void> _saveMedia() async {
// 请求权限
if (await Permission.storage.request().isGranted) {
// 保存图片
await saveNetworkImage('https://example.com/image.jpg');
// 保存视频
await saveNetworkVideo('https://example.com/video.mp4');
}
}
@override
Widget build(BuildContext context) {
return ElevatedButton(
onPressed: _saveMedia,
child: Text('保存媒体文件'),
);
}
}
注意事项
- 权限处理:在保存前需要请求存储权限
- 错误处理:添加 try-catch 处理异常
- 文件格式:确保文件格式受支持
- 存储空间:检查设备存储空间是否充足
推荐使用 image_gallery_saver 和 gallery_saver 插件,它们提供了最简便的保存到相册的方法。