我正在尝试从相机和图库中获取图像,并对它们进行处理,然后将原始图像的uri存储在SharedPreferences中。我可以从两者中选择一个并成功显示它们,但是对于图库图像,只要不清除内存(从历史记录中关闭该应用程序),我就可以从共享偏好中检索它们并将其显示在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级别。
答案 0 :(得分:0)
这是图库图片的uri
不,不是。它可能是Uri
转换到全部大写后。
,然后将原始图像的uri存储在SharedPreferences中
那将无法可靠地工作。您从Uri
或ACTION_GET_CONTENT
will work temporarily, in whatever activity that you made those requests in之类的东西中获得的任何ACTION_PICK
。 Uri
可能在其他任何地方都无法使用,包括将来应用程序的副本。结果,像这样保存Uri
不太可能很好。
要么:
Uri
,而应复制图像本身ACTION_OPEN_DOCUMENT
,这样您就可以在takePersistableUriPermissions()
上使用ContentResolver
以便能够随着时间的推移使用Uri
;或Intent
选择图片,而应使用a file picker library或类似的图片