【问题标题】:How to load an image from intent in Flutter?如何在 Flutter 中从意图加载图像?
【发布时间】:2018-05-26 15:22:25
【问题描述】:

我正在使用分享按钮从 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 中有关。

【问题讨论】:

    标签: android android-intent dart flutter


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 由于path_providergetTemporaryDirectory() 的实现可能会更改为使用另一个目录,因此使用flutter_android 插件的Context.cacheDir getter 更安全,它将与Java 上的getCacheDir() 完全匹配后端。
    猜你喜欢
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2021-11-23
    • 2020-06-16
    • 2019-06-29
    • 2021-04-28
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多