9

我正在制作一个 Android 应用程序,并且在使用图像选择器插件时;

final pickedFile = await ImagePicker().getImage(source: ImageSource.gallery);
File image = File(pickedFile.path);

“图像”是应用程序缓存中原始图像的副本,但是,我想直接使用原始图像的路径将其保存在我的应用程序中,因为我不希望应用程序缓存大小增加。我看到不推荐使用的方法“pickImage”完成了这一点(不复制到缓存),但新的“getImage”似乎会自动复制,并且'image's path是缓存图像的路径。

如何在不缓存的情况下仅获取所选图像的原始路径?(我假设使用原始文件的路径仍然可以在应用程序中显示它FileImage(File(originalPath)),这是正确的假设吗?)

4

2 回答 2

0

在 iOS 上,永远不可能检索到原始路径,而在 Android 上,直到 SDK 30 才有可能。

从file_picker 插件的常见问题解答中

在 Android 上的 file_picker 2.0.0 之前,原始路径是可能的,但是,在 iOS 中,它们根本不可能,因为 iOS 希望您制作一个缓存副本并对其进行处理。但是,2.0.0 引入了范围存储支持 (Android 10),并且根据 Android 文档建议,应以两种方式访问​​文件:

  • 通过文件 URI 选择用于 CRUD 操作(读取、删除、编辑)的文件并直接使用它——这是你真正想要的,但不幸的是 Flutter 不支持它,因为它需要一个绝对路径来打开文件描述符;
  • 临时缓存文件以进行上传或类似操作,或者只是复制到您的应用程序的持久存储中,以便您以后可以访问它 - 这是当前正在做的事情,即使您可能在第一次选择后移动/复制文件还有一个额外的步骤,让它更安全可靠地访问任何 Android 设备上的任何允许文件。
于 2021-09-03T16:01:51.493 回答
-1

我有一个file_picker包的例子:

  var filePath = '';
  var fileExtension = '';
  var fileName = '';

  void buttonOnTap() async {
    try {
      filePath = await FilePicker.getFilePath(type: FileType.IMAGE);

      if (filePath != null) {
        fileName = filePath.split('/').last;
        fileExtension = fileName.split('.').last;
      } else {
        filePath = '';
        fileName = '';
        fileExtension = '';
      }
    } catch (e) {}

    if (filePath != '') {
      Image.file(File(filePath), fit: BoxFit.cover);
    }
  }
于 2020-08-08T00:21:06.927 回答