[Day09] Flutter with GetX gallery_saver 照片影片存到相簿

Gallery saver


取得权限的前置作业
iOS
Info.plist内新增
NSPhotoLibraryUsageDescription的权限

Android 
AndroidManifest.xml 内新增
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

androidManifest


程序部分 延续前两篇

1. image_picker 相簿或拍照选出一张照片

2. image_cropper 裁切或旋转

3. gallery_saver 存档至手机相簿(也就是本篇)

在getImage()里面 呼叫GallerySaver.saveImage(), 并给图片路径.

getImage(ImageSource source) async {
    final _picker = ImagePicker();
    XFile? pickedFile = await _picker.pickImage(source: source);
    if (pickedFile != null) {
      imageFilePath = await cropImage(pickedFile.path);
      GallerySaver.saveImage(imageFilePath);
    } 
  }

如果图片来源自网址

  saveFromUrl(String urlPath) async {
    GallerySaver.saveImage(urlPath).then((bool success) {
        //success callback
    });
  }

来源自网址的影片也可以下载到手机相簿里
之前处理这段遇到了一个问题是
GallerySaver虽然可以自动判断是本地路径或是url
但如果来源的网址很长或被判断是不可下载的网址
作法改成:

  1. 组一个暂存路径
  2. 用Dio下载到一个暂存路径(这里用到path_provider)
  3. 传暂存路径给GallerySaver存到相簿
  Future<bool> saveVideoToAlbum(String urlPath) async {
    //先创一个暂时路径, getTemporaryDirectory() 需导入path_provider
    Directory appDocDir = await getTemporaryDirectory();
    final String timeStamp = DateTime.now().millisecondsSinceEpoch.toString();
    //档名暂时用timeStamp命名
    String temporaryPath = appDocDir.path + "$timeStamp.mp4";
    //把档案用Dio download存到暂时路径
    final response = await Dio().download(urlPath, temporaryPath,
        onReceiveProgress: (count, total) {
      //这边是下载进度的换算, 可以从这里取出数值
      print((count / total * 100).toStringAsFixed(0) + "%");
    });
    //再用GallerySaver存到相簿
    bool? isSucceed = await GallerySaver.saveVideo(temporaryPath);
    if (isSucceed != null) {
      if (isSucceed) {
        //最後再将暂存的档案删除
        deleteTemporaryFile(temporaryPath);
        return true;
      }
    }
    return false;
  }
  
  deleteTemporaryFile(String filePath) async {
    try {
      await File(filePath).delete();
    } catch (error) {
      print('Delete TemporaryFile error');
      print(error);
    }
  }

本篇的GitHub source code

下一篇将为大家介绍 flutter_slidable
ListView(iOS的 tableView)左右滑动的操作


<<:  JWT实作(四)(Day8)

>>:  Day 9 学习线上服务思考用户的数位防身术-国外篇

我们的基因体时代-AI, Data和生物资讯 Day21- 基因注释资料在Bioconductor中物件:IRanges和GenomicRanges

上一篇我们的基因体时代-AI, Data和生物资讯 Day20-注释基因资讯的BED档案格式和bed...

MySQL 字串类型资料之基本操作

VARCHAR & CHAR VARCHAR(0-65535)/CHAR(0-255)差别於...

Day 30. 参赛心得

原本不打算参加今年的活动,但还是在开始报名後点了,画面停在题目栏许久,想想要带给大家甚麽不同的东西,...

[Day05] Vue i18n - Component Interpolation

在本地化 (localize) 文字讯息时,我们可能会遇到需要特别处理 HTML tag的情况,什...

排线相机

还记得之前我装了个相机吗? 当初很害怕地把它组装上去,就怕插错或是折到排线,以至於他不能正常动作 那...