我想从两个摄像头和画廊图像,并做他们一些东西,然后存储原始图像的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这是行不通的工作well.but。我没有在其他API级别尝试。
这是画廊图像的URI
不,事实并非如此。这可能是转换为全部大写后的Uri
。
然后存储在SharedPreferences原始图像的URI
这将无法可靠地工作。您从东西像Uri
或ACTION_GET_CONTENT
ACTION_PICK
得到任何will work temporarily, in whatever activity that you made those requests in。该Uri
可能无法使用其他任何地方,包括您应用的副本。其结果是,节省了Uri
像那些不太可能工作得很好。
或者:
Uri
,而是使图像本身的副本ACTION_OPEN_DOCUMENT
,因为那么你可以使用takePersistableUriPermissions()
上ContentResolver
能够使用Uri
随着时间的推移;要么Intent
选择图像,而是使用a file picker library或类似的东西