显示先前存储的图像uri

时间:2019-02-02 22:39:49

标签: java android image uri

我正在尝试从相机和图库中获取图像,并对它们进行处理,然后将原始图像的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级别。

1 个答案:

答案 0 :(得分:0)

  

这是图库图片的uri

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

  

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

那将无法可靠地工作。您从UriACTION_GET_CONTENT will work temporarily, in whatever activity that you made those requests in之类的东西中获得的任何ACTION_PICKUri可能在其他任何地方都无法使用,包括将来应用程序的副本。结果,像这样保存Uri不太可能很好。

要么:

  • 请勿保存Uri,而应复制图像本身
  • 使用ACTION_OPEN_DOCUMENT,这样您就可以在takePersistableUriPermissions()上使用ContentResolver以便能够随着时间的推移使用Uri;或
  • 请勿使用Intent选择图片,而应使用a file picker library或类似的图片