如何使用 Flutter 将图像保存到照片库?

How to save an image to the photo gallery using Flutter?

我的 flutter 应用使用 camera package to take a photo, which I save to the application's data directory (obtained from path_providergetApplicationDocumentsDirectory() 函数)。

如何将此图像文件保存到 phone 照片库中?我注意到 image_picker 包允许 阅读 来自画廊,但我该如何写信给它?

不幸的是,flutter 目前没有公开该功能。不过,它确实看起来像是插件的候选者。

如果你有足够的动力,你可以使用 platform channels 从 flutter 到原生 Android(和 iOS)代码,你可以从中获得完整的画廊访问权限.如果你把它做成一个插件并发布它,奖励积分!

我做了这个插件。喜欢的可以试试

https://pub.dartlang.org/packages/image_downloader#-readme-tab-

更新

我会解释如何使用。

将此添加到您的包的 pubspec.yaml 文件中:

dependencies:
  image_downloader: ^0.9.0

之后,为每个设备指定权限。

只需写入以下内容即可保存图像。

ImageDownloader.downloadImage(url);

有一个插件支持这个。

https://pub.dev/packages/image_gallery_saver

我已经测试过了,它工作正常。

https://pub.dev/packages/gallery_saver

此插件将图像和视频保存到 gallery/photos。

您只需要向它提供您从相机(甚至网络 url 获得的临时文件的路径,它也可以工作):

GallerySaver.saveVideo(recordedVideo.path);
GallerySaver.saveImage(recordedImage.path);

我一直在寻找这个答案,但幸运的是,我可以使用以下代码将文件保存到图库:

ByteData byteData = await rootBundle.load('assets/images/example.png');
File file = await File('/storage/emulated/0/Android/media/<your app package>/<App title/folder>/example.png').create(recursive: true);
await MediaStore.saveImage(byteData.buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));

这会将您的图像保存到设备和设备图库中。

这仅适用于 Android

谢谢。

有一个包,您可以通过提供图像或视频的路径来更新图库。与其他软件包相比,它的优势在于您甚至可以将文件保存在 SD 卡中。当您尝试将已保存到设备的媒体添加到图库时,该文件不会保存两次。 这是包的 link。 https://pub.dev/packages/media_scanner

MediaScanner.loadMedia("Path to the file or directory"); // This will update the gallery

这只是Android

我不得不进行大量搜索,但我找到了一个非常有用的解决方案,可以将图像保存在单元格 phone 的照片库中,并获得绝对路径以按您想要的方式使用它。 对于这个例子,我使用了从照片库中保存图像获得的结果,但是它也可以读取其他文件,显然做出你认为必要的更改,我希望它能帮助你 uri_to_file image_gallery_saver

import 'dart:io';

import 'package:image_gallery_saver/image_gallery_saver.dart';
import 'package:uri_to_file/uri_to_file.dart';

Future<File> saveImage(File image, String identifier) async {
try {
    var result = await 
    ImageGallerySaver.saveImage(image.readAsBytesSync(),
     quality: 60, name: identifier + 
    "-${DateTime.now().toIso8601String()}");
    print(result);
    File file = await toFile(Uri.parse(result['filePath']));
    print(file);
    return file;
   } catch (e) {
     print(e);
    return new File('assets/img/default-img.jpg');
  }
}
// example
saveImage(File("path/image/img223.jpg"),"img-test");
// or

有一个解决方法,我通过指定“/storage/emulated/0/DCIM/YOUR_FOLDER/YOUR_FILE_NAME”的路径使它起作用,然后它将保存在支持包目录之外,然后图像出现在图库中。 您可以使用任何图像保护程序插件,只需提供该硬编码路径即可。