Flutter 保存图片到本地相册

本方案可实现保存网络图片和 assets 中的图片到本地相册。

Flutter 保存图片到本地相册_第1张图片
Flutter 保存图片到本地相册

需要使用到 package:

  • image_gallery_saver 保存文件或图片到本地;
  • cached_network_image 图片缓存管理;
  • permission_handler 授权管理;

用到的权限上述相关 package 均已给出。

实现方法:

/// 使用 File api
import 'dart:io';
/// 使用 Uint8List 数据类型
import 'dart:typed_data';

/// 使用 DefaultCacheManager 类(可能无法自动引入,需要手动引入)
import 'package:flutter_cache_manager/flutter_cache_manager.dart';

/// 授权管理
import 'package:permission_handler/permission_handler.dart';
/// 图片缓存管理
import 'package:cached_network_image/cached_network_image.dart';
/// 保存文件或图片到本地
import 'package:image_gallery_saver/image_gallery_saver.dart';

class AppUtil {
  /// 保存图片到相册
  ///
  /// 默认为下载网络图片,如需下载资源图片,需要指定 [isAsset] 为 `true`。
  static Future saveImage(String imageUrl, {bool isAsset: false}) async {
    try {
      if (imageUrl == null) throw '保存失败,图片不存在!';

      /// 权限检测
      PermissionStatus storageStatus = await Permission.storage.status;
      if (storageStatus != PermissionStatus.granted) {
        storageStatus = await Permission.storage.request();
        if (storageStatus != PermissionStatus.granted) {
          throw '无法存储图片,请先授权!';
        }
      }

      /// 保存的图片数据
      Uint8List imageBytes;

      if (isAsset == true) {
        /// 保存资源图片
        ByteData bytes = await rootBundle.load(imageUrl);
        imageBytes = bytes.buffer.asUint8List();
      } else {
        /// 保存网络图片
        CachedNetworkImage image = CachedNetworkImage(imageUrl: imageUrl);
        DefaultCacheManager manager = image.cacheManager ?? DefaultCacheManager();
        Map headers = image.httpHeaders;
        File file = await manager.getSingleFile(
          image.imageUrl,
          headers: headers,
        );
        imageBytes = await file.readAsBytes();
      }

      /// 保存图片
      final result = await ImageGallerySaver.saveImage(imageBytes);

      if (result == null || result == '') throw '图片保存失败';

      print("保存成功");
    } catch (e) {
      print(e.toString());
    }
  }
}

用法如下:

  • AppUtil.saveImage('https://upload-images.jianshu.io/upload_images/795923-c5bcd041afcdfc23.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240'); 下载网络图片
  • AppUtil.saveImage('assets/images/wechat_code.png', isAsset: true); 下载资源图片

你可能感兴趣的:(Flutter 保存图片到本地相册)