显示先前存储的图像 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_CONTENT
或ACTION_PICK
will work temporarily, in whatever activity that you made those requests in 等处获得的Uri
。 Uri
可能无法在其他任何地方使用,包括您的应用程序的未来副本。因此,像这样保存 Uri
不太可能效果很好。
要么:
不要保存Uri
,而是复制图像本身
使用ACTION_OPEN_DOCUMENT
,这样你就可以在ContentResolver
上使用takePersistableUriPermissions()
,以便随着时间的推移使用Uri
;或
不要使用Intent
来选择图像,而是使用a file picker library 或类似的东西
【讨论】:
以上是关于显示先前存储的图像 uri的主要内容,如果未能解决你的问题,请参考以下文章