Flutter图片保存插件gallery_saver_updated的使用
Flutter图片保存插件gallery_saver_updated的使用
gallery_saver_updated
是一个用于在Flutter应用程序中保存图片和视频到设备相册的插件。它支持从网络或临时文件保存图片和视频,并且这些媒体文件会在Android的图库和iOS的照片应用中可见。
注意事项
- 如果你要保存网络上的图片或视频链接,确保链接包含
http
或https
前缀。 - 该插件支持保存本地文件路径和网络URL。
安装
首先,在你的 pubspec.yaml
文件中添加 gallery_saver_updated
作为依赖项:
dependencies:
gallery_saver_updated: ^latest_version
iOS配置
在 <project root>/ios/Runner/Info.plist
文件中添加以下键值对:
NSPhotoLibraryUsageDescription
- 描述为什么你的应用需要访问照片库权限。例如:<key>NSPhotoLibraryUsageDescription</key> <string>我们需要访问您的照片库以保存图片和视频</string>
Android配置
在 AndroidManifest.xml
文件中添加以下权限:
android.permission.WRITE_EXTERNAL_STORAGE
- 用于写入外部存储的权限。
示例代码
下面是一个完整的示例代码,展示了如何使用 gallery_saver_updated
插件来保存图片和视频。该示例包括拍照、录制视频以及保存网络图片和视频的功能。
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:gallery_saver_updated/gallery_saver.dart';
import 'package:image_picker/image_picker.dart';
void main() => runApp(MyApp());
class MyApp extends StatefulWidget {
@override
_MyAppState createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
String firstButtonText = 'Take photo';
String secondButtonText = 'Record video';
double textSize = 20;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: Container(
color: Colors.white,
child: Column(
children: <Widget>[
Flexible(
flex: 1,
child: Container(
child: SizedBox.expand(
child: TextButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.blue),
),
onPressed: _takePhoto,
child: Text(firstButtonText,
style: TextStyle(fontSize: textSize, color: Colors.white)),
),
),
),
),
Flexible(
child: Container(
child: SizedBox.expand(
child: TextButton(
style: ButtonStyle(
backgroundColor: MaterialStateProperty.all(Colors.white),
),
onPressed: _recordVideo,
child: Text(secondButtonText,
style: TextStyle(fontSize: textSize, color: Colors.blueGrey)),
),
),
),
flex: 1,
)
],
),
),
),
),
);
}
void _takePhoto() async {
// 使用 ImagePicker 拍照
final ImagePicker picker = ImagePicker();
final XFile? image = await picker.pickImage(source: ImageSource.camera);
if (image != null) {
setState(() {
firstButtonText = 'saving in progress...';
});
// 保存图片到相册
GallerySaver.saveImage(image.path).then((bool success) {
setState(() {
firstButtonText = 'image saved!';
});
});
}
}
void _recordVideo() async {
// 使用 ImagePicker 录制视频
final ImagePicker picker = ImagePicker();
final XFile? video = await picker.pickVideo(source: ImageSource.camera);
if (video != null) {
setState(() {
secondButtonText = 'saving in progress...';
});
// 保存视频到相册
GallerySaver.saveVideo(video.path).then((bool success) {
setState(() {
secondButtonText = 'video saved!';
});
});
}
}
void _saveNetworkVideo() async {
// 保存网络视频
String path = 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4';
GallerySaver.saveVideo(path).then((bool success) {
print('Video is saved');
});
}
void _saveNetworkImage() async {
// 保存网络图片
String path = 'https://image.shutterstock.com/image-photo/montreal-canada-july-11-2019-600w-1450023539.jpg';
GallerySaver.saveImage(path).then((bool success) {
print('Image is saved');
});
}
}
代码说明
-
主界面布局:
- 两个按钮分别用于拍照和录制视频。
- 按钮点击后会调用
_takePhoto
和_recordVideo
方法。
-
拍照功能 (
_takePhoto
):- 使用
ImagePicker
拍照,获取图片路径。 - 调用
GallerySaver.saveImage
将图片保存到相册。 - 保存成功后,更新按钮文本为 “image saved!”。
- 使用
-
录制视频功能 (
_recordVideo
):- 使用
ImagePicker
录制视频,获取视频路径。 - 调用
GallerySaver.saveVideo
将视频保存到相册。 - 保存成功后,更新按钮文本为 “video saved!”。
- 使用
-
保存网络图片和视频:
_saveNetworkImage
和_saveNetworkVideo
方法展示了如何保存网络上的图片和视频。- 直接传递网络URL给
GallerySaver.saveImage
或GallerySaver.saveVideo
即可。
其他功能
- 指定保存到特定相册:你可以通过传递
albumName
参数来指定保存到哪个相册。例如:GallerySaver.saveImage(image.path, albumName: 'MyAlbum').then((bool success) { print('Image saved to MyAlbum'); });
更多关于Flutter图片保存插件gallery_saver_updated的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter图片保存插件gallery_saver_updated的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用gallery_saver_updated
插件来保存图片的示例代码。这个插件允许你将图片保存到设备的图库中。
首先,你需要在你的pubspec.yaml
文件中添加这个插件的依赖项:
dependencies:
flutter:
sdk: flutter
gallery_saver_updated: ^x.y.z # 请将x.y.z替换为当前最新版本号
然后,运行flutter pub get
来安装依赖项。
接下来,你需要在代码中导入这个插件并使用它。以下是一个完整的示例,展示了如何保存一个网络图片到图库中:
- 创建一个新的Flutter项目(如果还没有的话)。
- 打开
main.dart
文件,并进行如下修改:
import 'package:flutter/material.dart';
import 'package:gallery_saver_updated/gallery_saver.dart';
import 'package:http/http.dart' as http;
import 'dart:typed_data';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Gallery Saver Example'),
),
body: Center(
child: ElevatedButton(
onPressed: _saveImage,
child: Text('Save Image'),
),
),
),
);
}
Future<void> _saveImage() async {
try {
// 下载图片(这是一个网络图片URL,你可以替换为你自己的)
final response = await http.get(Uri.parse('https://example.com/path/to/your/image.jpg'));
final Uint8List imageBytes = response.bodyBytes;
// 保存图片到图库
final result = await GallerySaver.saveImage(imageBytes, albumName: 'MyAppImages');
if (result) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Image saved successfully!')),
);
} else {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Failed to save image.')),
);
}
} catch (e) {
print('Error saving image: $e');
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text('Error saving image: $e')),
);
}
}
}
在这个示例中,我们:
- 使用
http
包从网络下载了一张图片。 - 将下载的图片字节数据传递给
GallerySaver.saveImage
方法,该方法将图片保存到设备的图库中。 - 使用
ScaffoldMessenger.of(context).showSnackBar
来显示操作结果(成功或失败)。
注意:
- 你需要确保你的应用具有写入外部存储的权限。对于Android,这通常需要在
AndroidManifest.xml
中声明权限,并在运行时请求权限(从Android 6.0开始)。 - 对于iOS,你需要在
Info.plist
中添加相应的权限声明。
由于权限处理可能会因项目而异,这里不再赘述。你可以根据Flutter的官方文档或插件的README文件来添加和处理权限请求。