Flutter图片保存插件gallery_saver的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter图片保存插件 gallery_saver 的使用

Gallery Saver 是一个用于将图片和视频从网络或临时文件保存到外部存储的Flutter插件。保存后的图片和视频可以在Android相册和iOS照片中查看。

注意事项

  • 如果你想保存网络上的图片或视频链接,链接必须包含 'http/https' 前缀。

安装

首先,在你的 pubspec.yaml 文件中添加 gallery_saver 作为依赖项:

dependencies:
  gallery_saver: ^2.0.0 # 请根据最新版本调整

iOS 配置

<项目根目录>/ios/Runner/Info.plist 文件中添加以下键值对:

<key>NSPhotoLibraryUsageDescription</key>
<string>我们需要访问您的相册来保存图片和视频。</string>

Android 配置

AndroidManifest.xml 文件中添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

示例代码

下面是一个完整的示例demo,展示了如何使用 gallery_saver 插件来保存图片和视频。

import 'dart:io';
import 'dart:typed_data';
import 'dart:ui' as ui;

import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
import 'package:image_picker/image_picker.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'package:path_provider/path_provider.dart';

double textSize = 20;

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String firstButtonText = '拍照';
  String secondButtonText = '录制视频';
  String albumName = 'Media';

  @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)),
                      ),
                    ),
                  ),
                ),
                ScreenshotWidget(),
                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 {
    final pickedFile = await ImagePicker().getImage(source: ImageSource.camera);
    if (pickedFile != null && pickedFile.path != null) {
      setState(() {
        firstButtonText = '保存中...';
      });
      GallerySaver.saveImage(pickedFile.path, albumName: albumName).then((bool success) {
        setState(() {
          firstButtonText = '图片已保存!';
        });
      });
    }
  }

  void _recordVideo() async {
    final pickedFile = await ImagePicker().getVideo(source: ImageSource.camera);
    if (pickedFile != null && pickedFile.path != null) {
      setState(() {
        secondButtonText = '保存中...';
      });
      GallerySaver.saveVideo(pickedFile.path, albumName: albumName).then((bool success) {
        setState(() {
          secondButtonText = '视频已保存!';
        });
      });
    }
  }
}

class ScreenshotWidget extends StatefulWidget {
  @override
  _ScreenshotWidgetState createState() => _ScreenshotWidgetState();
}

class _ScreenshotWidgetState extends State<ScreenshotWidget> {
  final GlobalKey _globalKey = GlobalKey();
  String screenshotButtonText = '保存截图';

  @override
  Widget build(BuildContext context) {
    return Flexible(
      flex: 1,
      child: RepaintBoundary(
        key: _globalKey,
        child: Container(
          child: SizedBox.expand(
            child: TextButton(
              style: ButtonStyle(
                backgroundColor: MaterialStateProperty.all(Colors.pink),
              ),
              onPressed: _saveScreenshot,
              child: Text(screenshotButtonText,
                  style: TextStyle(fontSize: textSize, color: Colors.white)),
            ),
          ),
        ),
      ),
    );
  }

  Future<void> _saveScreenshot() async {
    setState(() {
      screenshotButtonText = '保存中...';
    });
    try {
      // 提取字节数据
      final RenderRepaintBoundary boundary = _globalKey.currentContext.findRenderObject();
      final ui.Image image = await boundary.toImage(pixelRatio: 3.0);
      final ByteData byteData = await image.toByteData(format: ui.ImageByteFormat.png);
      final Uint8List pngBytes = byteData.buffer.asUint8List();

      // 创建文件
      final String dir = (await getApplicationDocumentsDirectory()).path;
      final String fullPath = '$dir/${DateTime.now().millisecond}.png';
      File capturedFile = File(fullPath);
      await capturedFile.writeAsBytes(pngBytes);
      print(capturedFile.path);

      await GallerySaver.saveImage(capturedFile.path).then((value) {
        setState(() {
          screenshotButtonText = '截图已保存!';
        });
      });
    } catch (e) {
      print(e);
    }
  }
}

这个示例展示了如何通过相机拍摄图片和视频,并将其保存到设备的相册中。此外,还演示了如何截取屏幕并保存为图片。希望这对您有所帮助!


更多关于Flutter图片保存插件gallery_saver的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter图片保存插件gallery_saver的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用gallery_saver插件来保存图片的示例代码。gallery_saver插件允许你将图片保存到设备的相册中。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加gallery_saver依赖:

dependencies:
  flutter:
    sdk: flutter
  gallery_saver: ^3.0.0  # 请检查最新版本号

然后运行以下命令来安装依赖:

flutter pub get

2. 导入插件

在你的Dart文件中导入gallery_saver插件:

import 'package:gallery_saver/gallery_saver.dart';

3. 请求权限

在Android和iOS上保存图片到相册需要请求权限。你需要在AndroidManifest.xml中添加权限,并在iOS的Info.plist中声明权限。

Android

AndroidManifest.xml中添加以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

iOS

Info.plist中添加以下条目:

<key>NSPhotoLibraryAddUsageDescription</key>
<string>We need your permission to save photos to your photo library.</string>

4. 请求并保存图片

以下是一个完整的示例,展示如何请求权限并保存图片到相册:

import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'package:permission_handler/permission_handler.dart';

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: SaveImageButton(),
        ),
      ),
    );
  }
}

class SaveImageButton extends StatefulWidget {
  @override
  _SaveImageButtonState createState() => _SaveImageButtonState();
}

class _SaveImageButtonState extends State<SaveImageButton> {
  final GallerySaver _gallerySaver = GallerySaver();

  void _saveImage() async {
    // 请求存储权限
    var status = await Permission.storage.status;
    if (!status.isGranted) {
      status = await Permission.storage.request();
      if (!status.isGranted) {
        return; // 用户拒绝了权限请求
      }
    }

    // 图片路径(这里假设你有一个图片路径)
    final imagePath = 'path/to/your/image.jpg'; // 替换为你的图片路径

    // 保存图片到相册
    final result = await _gallerySaver.saveImage(imagePath, albumName: 'MyAppImages');
    if (result) {
      print('Image saved successfully');
    } else {
      print('Failed to save image');
    }
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _saveImage,
      child: Text('Save Image to Gallery'),
    );
  }
}

注意事项

  1. 图片路径:确保imagePath变量指向一个有效的图片文件路径。你可以使用path_provider插件来获取设备存储的路径,或者使用网络图片的缓存路径。

  2. 权限处理:在实际应用中,处理权限请求和拒绝的情况非常重要。上述代码只是简单的示例,你可能需要更复杂的逻辑来处理用户拒绝权限的情况。

  3. 错误处理:在实际应用中,添加适当的错误处理逻辑,以便在保存图片失败时能够给用户适当的反馈。

这个示例展示了如何使用gallery_saver插件将图片保存到设备的相册中。你可以根据需要进行修改和扩展。

回到顶部