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

k0pti3hp  于 2023-05-29  发布在  Flutter
关注(0)|答案(9)|浏览(362)

我的flutter应用程序使用camera包来拍摄照片,我保存到应用程序的data目录(从path_providergetApplicationDocumentsDirectory()函数获得)。
如何将此图像文件保存到手机照片库中?我注意到image_picker包允许从gallery中 * 阅读 *,但是我如何向它写入呢?

ve7v8dk2

ve7v8dk21#

https://pub.dev/packages/gallery_saver
这个插件保存图像和视频到画廊/照片.
你只需要提供你从相机得到的临时文件的路径(甚至是网络URL,它也可以工作):

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

bgtovc5b2#

不幸的是,flutter目前还没有公开该功能。它看起来确实像一个插件的候选人。
如果你有足够的动力,你可以使用platform channels从flutter到原生Android(和iOS)代码进行通信,从那里你可以完全访问图库。如果你把它做成一个插件并发布它,你会得到额外的分数!

j5fpnvbx

j5fpnvbx3#

有一个插件支持这个。
https://pub.dev/packages/image_gallery_saver
我已经测试过了,它工作正常。

jljoyd4f

jljoyd4f4#

我做了插件。如果你喜欢的话,请试试。
https://pub.dartlang.org/packages/image_downloader#-readme-tab-

更新

我将解释如何使用。
将以下内容添加到您的软件包的pubspec.yaml文件中:

dependencies:
  image_downloader: ^0.9.0

然后,为每个设备指定权限。
只需输入以下内容,图像将被保存。

ImageDownloader.downloadImage(url);
5t7ly7z5

5t7ly7z55#

我一直在寻找这个答案一段时间,但幸运的是,我能够保存文件到画廊与以下代码:

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

谢谢。

esyap4oy

esyap4oy6#

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

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

仅限Android

dl5txlt9

dl5txlt97#

我不得不搜索了很多,但我发现了一个非常有用的解决方案,将图像保存在手机的照片库中,并获得绝对路径,以您想要的方式使用它。在这个例子中,我使用了从照片库中保存图像获得的结果,但是它也可以读取其他文件,显然可以进行必要的更改,我希望它能帮助您uri_to_fileimage_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
sshcrbum

sshcrbum8#

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

7vux5j2d

7vux5j2d9#

这对我很有效-

// https://pub.dev/packages/path_provider
Future<String> getExtStorageOrDownloadsDirPath() async {
  final documentsDir = await getApplicationDocumentsDirectory();
  if (Platform.isAndroid) {
     //final extStorageDir = await getExternalStorageDirectory();
     //return extStorageDir?.path ?? documentsDir.path;
     return '/storage/emulated/0/Download';
  } else {
     final downloadsDir = await getDownloadsDirectory();
     return downloadsDir?.path ?? documentsDir.path;
  }
}

一旦你得到path,你可以这样保存

if (imageBytes != null) {
  XFile xFile = XFile.fromData(imageBytes, mimeType: 'image/png');
  String documentsDirPath = await getExtStorageOrDownloadsDirPath();
  String filePath =
      '$documentsDirPath/${widget.bannerData.creativeTitle?.split(' ').join('-')}.png';
  if (await Permission.storage.request().isGranted) {
    // Either the permission was already granted before or the user just granted it.
    xFile.saveTo(filePath);
    showToastMessage('Saved to $filePath');
  }
}

相关问题