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文件来添加和处理权限请求。
        
      
            
            
            
