首页 > 解决方案 > 如何在 Flutter 中从意图加载图像?

问题描述

我正在使用共享按钮从 android 照片应用程序共享图像。意图句柄函数如下所示:

void handleFileIntent(Intent intent) {
    System.out.println("inside intent");
    Uri imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
    fileName = imageUri.getPath();

转换为字符串的 Uri 返回以下内容:

content://com.google.android.apps.photos.contentprovider/-1/1/content%3A%2F%2Fmedia%2Fexternal%2Fimages%2Fmedia%2F33/REQUIRE_ORIGINAL/NONE/257321333

对 Uri 的 getPath() 调用返回以下内容:

/-1/1/content://media/external/images/media/33/REQUIRE_ORIGINAL/NONE/796304333

我正在努力寻找在 Flutter 中打开这些资源的方法。我该怎么做呢?

我了解这些内容 URL 与在 Android 中打开/访问图像所需的权限捆绑在一起。我知道这个上下文不一定会传递给 Flutter。我也明白这是两个不同的问题,但它们与将图像加载到 Flutter 中有关。

标签: androidandroid-intentdartflutter

解决方案


正如您所说,资源权限与 Intent 捆绑在一起。但是,这对您应该是透明的,因为您应该能够使用(在 MainActivity 中)获取 InputStream:

InputStream inputStream = getContentResolver().openInputStream(imageUri);

由于权限仅在 Intent 的生命周期内有效,您可能应该使用此 InputStream 立即将文件读取到内存或您自己的应用程序拥有的临时文件中(取决于照片的大小)。

一旦 Widget 被渲染,您可以通过 , 请求字节数组或文件名MethodChannel,并且在 Flutter 中,使用Image.memoryorImage.file构造函数创建一个 Image Widget。

如果使用临时文件方法,getCacheDir()请在 Java 中使用来查找缓存文件夹。创建您自己的临时文件名,然后复制该文件。在 Flutter 端,使用package:path_provider - getTemporaryDirectory()查找相同的目录。只需通过 MethodChannel 传递文件名。


推荐阅读