显示先前存储的图像 uri

Posted

技术标签:

【中文标题】显示先前存储的图像 uri【英文标题】:Displaying previously stored uri of image 【发布时间】:2019-02-02 22:39:48 【问题描述】:

我正在尝试从相机和图库中获取图像并对它们进行一些处理,然后将原始图像的 uri 存储在 SharedPreferences 中。我可以从它们中选择并成功显示它们,但是对于画廊图像,只要我没有清除内存(从历史记录中关闭应用程序),我可以从 sharedprefrences 中检索它们并在 Imageview 中显示它们,但是在关闭之后历史记录中的应用程序,检索到的 URI 不再显示。

我以这种方式存储 URI:

@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent data) 
    if (requestCode == REQUEST_CAPTURE_IMAGE) 
        if (resultCode == RESULT_OK) 
            Uri imageUri = Uri.parse("file:" + photoFile.getAbsolutePath());
            storeInPreferences(imageUri.toString());

         else Toast.makeText(this, "Canceled", Toast.LENGTH_SHORT).show();
     
    else if (requestCode == REQUEST_GALLERY) 
        if (resultCode == RESULT_OK) 
            if (data != null) 
                storeInPreferences(data.getData().toString());
            
         else Toast.makeText(this, "Canceled", Toast.LENGTH_SHORT).show();
    

并尝试使用此代码显示检索到的 URI:

 Picasso.with(mContext)
           .load(Uri.parse(getStringUriFromPrefs()))
           .resize(500, 500)
           .error(R.drawable.ic_error)
           .into(holder.iv_card);

这仅适用于图库图片。我直接从相机拍摄的那些图像显示得很好。

这是图库图片的 uri:(我有问题)

CONTENT://COM.android.PROVIDERS.MEDIA.DOCUMENTS/DOCUMENT/IMAGE%3A378071

这是相机图像的 uri:

FILE:/STORAGE/EMULATED/0/DCIM/CAMERA/20190202_224630_2332127860148701493.JPG

我还在 API 级别 18 中尝试过它并且效果很好。但是在 API 级别 22 和 26 中它不起作用。我还没有尝试过其他 API 级别。

【问题讨论】:

【参考方案1】:

这是画廊图片的 uri

不,不是。转换为全部大写后可能是Uri

然后将原始图像的 uri 存储在 SharedPreferences 中

这将无法可靠地工作。任何从ACTION_GET_CONTENTACTION_PICK will work temporarily, in whatever activity that you made those requests in 等处获得的UriUri 可能无法在其他任何地方使用,包括您的应用程序的未来副本。因此,像这样保存 Uri 不太可能效果很好。

要么:

不要保存Uri,而是复制图像本身 使用ACTION_OPEN_DOCUMENT,这样你就可以在ContentResolver上使用takePersistableUriPermissions(),以便随着时间的推移使用Uri;或 不要使用Intent 来选择图像,而是使用a file picker library 或类似的东西

【讨论】:

以上是关于显示先前存储的图像 uri的主要内容,如果未能解决你的问题,请参考以下文章

反应本机图像 URI 未显示

显示从相机拍摄的图像时,Uri 为空

如何将存储在数据库中的图像作为字符串显示到真实图像?

Uri 图像未显示在 android 设备上 (Xamarin)

更改出列注释视图的图像会导致先前使用的图像短暂出现

ANDROID ACTION_VIEW 显示来自 URI 的错误图像