Flutter媒体文件保存插件media_gallery_saver的使用

Flutter媒体文件保存插件media_gallery_saver的使用

支持的文件类型

  • jpg
  • png
  • gif
  • webp
  • heic
  • mp4

使用方法

pubspec.yaml文件中添加依赖:

dependencies:
  media_gallery_saver: ^1.0.0

iOS配置

要在iOS上获取保存权限,你需要在项目的info.plist文件中设置NSPhotoLibraryUsageDescription键。

<key>NSPhotoLibraryUsageDescription</key>
<string>为什么需要授权</string>

Android配置

在内部的AndroidManifest.xml文件中设置uses-permission

示例代码

以下是完整的示例代码,展示了如何使用media_gallery_saver插件保存媒体文件:

import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:media_gallery_saver/media_gallery_saver.dart';
import 'package:path_provider/path_provider.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 定义一个异步函数来处理保存操作
    onPressed() async {
      // 获取临时目录
      final tempDir = await getTemporaryDirectory();
      // 构建临时文件路径
      final tempFilePath = '${tempDir.path}/test.png';

      // 加载资源文件到内存
      ByteData byteData = await rootBundle.load('assets/test.png');
      // 获取缓冲区
      final buffer = byteData.buffer;
      // 创建文件对象
      File file = File(tempFilePath);
      // 将字节数据写入文件
      await file.writeAsBytes(
        buffer.asUint8List(
          byteData.offsetInBytes,
          byteData.lengthInBytes,
        ),
      );

      // 调用插件方法保存文件到相册
      MediaGallerySaver().saveMedia(
        file: file,
      );
    }

    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              const Text('media_gallery_saver'),
              const SizedBox(height: 20),
              // 显示测试图片
              Image.asset(
                'assets/test.png',
                width: 200,
                height: 200,
              ),
              const SizedBox(height: 20),
              // 保存按钮
              ElevatedButton(
                onPressed: onPressed,
                child: const Text('保存'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

更多关于Flutter媒体文件保存插件media_gallery_saver的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


当然,以下是如何在Flutter项目中使用media_gallery_saver插件来保存媒体文件的示例代码。这个插件允许你将图片或视频保存到设备的图库中。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加media_gallery_saver依赖:

dependencies:
  flutter:
    sdk: flutter
  media_gallery_saver: ^0.7.0  # 请检查最新版本号

然后运行flutter pub get来获取依赖。

2. 请求权限

在Android和iOS上保存文件需要请求相应的存储权限。你可以在AndroidManifest.xmlInfo.plist中声明这些权限,但更好的做法是使用permission_handler插件来请求运行时权限。

AndroidManifest.xml (如果需要手动添加)

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

Info.plist (对于iOS)

通常不需要手动添加权限,但确保你的项目配置允许访问照片库。

3. 使用media_gallery_saver保存图片

以下是一个保存图片到图库的示例:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:media_gallery_saver/media_gallery_saver.dart';
import 'package:image_picker/image_picker.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Media Gallery Saver Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _saveImage,
            child: Text('Save Image'),
          ),
        ),
      ),
    );
  }

  Future<void> _saveImage() async {
    final ImagePicker _picker = ImagePicker();
    final PickedFile? image = await _picker.pickImage(source: ImageSource.gallery);

    if (image != null) {
      final Uint8List imageBytes = await image.readAsBytes();
      final Result? result = await MediaGallerySaver.saveImage(imageBytes);

      if (result?.isSuccess ?? false) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Image saved successfully')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Failed to save image')),
        );
      }
    }
  }
}

4. 使用media_gallery_saver保存视频

以下是一个保存视频到图库的示例:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:media_gallery_saver/media_gallery_saver.dart';
import 'package:video_picker/video_picker.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Media Gallery Saver Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _saveVideo,
            child: Text('Save Video'),
          ),
        ),
      ),
    );
  }

  Future<void> _saveVideo() async {
    final VideoPicker _picker = VideoPicker();
    final PickedFile? video = await _picker.pickVideo(source: VideoSource.gallery);

    if (video != null) {
      final Uint8List videoBytes = await video.readAsBytes();
      final Result? result = await MediaGallerySaver.saveVideo(videoBytes, video.path.split('/').last);

      if (result?.isSuccess ?? false) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Video saved successfully')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Failed to save video')),
        );
      }
    }
  }
}

注意:由于视频文件通常较大,直接读取为Uint8List可能会导致内存问题。在实际应用中,你可能需要考虑使用文件路径直接保存,而不是先读取为字节数组。

5. 处理权限请求

在使用上述功能之前,确保已经请求并获得了必要的存储权限。这可以通过permission_handler插件来实现:

import 'package:permission_handler/permission_handler.dart';

Future<void> _requestPermissions() async {
  var status = await Permission.storage.status;
  if (!status.isGranted) {
    var result = await Permission.storage.request();
    if (!result.isGranted) {
      // 处理权限被拒绝的情况
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Storage permission is required')),
      );
    }
  }
}

在调用保存功能之前调用_requestPermissions()函数。

以上代码展示了如何在Flutter项目中使用media_gallery_saver插件来保存图片和视频文件。确保在实际应用中处理可能的错误和异常情况。

回到顶部