如何通过URI查看存储在图库中的图片



我正在创建一个应用程序,允许用户从图库中挑选照片。一旦他们点击照片,我就把uri保存到我的房间数据库中。当我试图返回并在我的应用程序中查看照片时,我得到了这个错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.dayaramo.wearyourcloset/com.dayaramo.wearyourcloset.EditItem}: java.lang.SecurityException: No persistable permission grants found for UID 10492 and Uri content://com.android.externalstorage.documents/document/primary:DCIM/Camera/20200508_145429.jpg

我知道你应该使用takePersistableUriPermissions,但它似乎忽略了这一点。

从库中选择并保存图像uri的代码是

void imageChooser() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK)  {
Uri selectedImageUri = data.getData();
if (null != selectedImageUri) {
// update the preview image in the layout
pictureResult.setImageURI(selectedImageUri);
}
}
}

再次查看照片的代码是

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
this.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
pictureResult.setImageURI(uri);

将照片从共享存储复制到应用程序内部存储是最佳做法吗?我不在乎照片是否被移动或删除,这就是为什么我只想使用URI而不是复制它。

对于Intent.ACTION_GET_CONTENT,您不能获得持久权限。

请改用ACTION_OPEN_DOCUMENT

正如你已经说过的,把它们放在ActivityResult上。

再次查看照片的代码是

除了最后一行,该代码片段的其余部分要么不正确,要么未使用。

相反,在onActivityResult()中调用takePersistableUriPermission(),这样您就可以立即请求持久访问:

@RequiresApi(api = Build.VERSION_CODES.KITKAT)
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == SELECT_PICTURE && resultCode == RESULT_OK)  {
Uri selectedImageUri = data.getData();
if (null != selectedImageUri) {
// update the preview image in the layout
pictureResult.setImageURI(selectedImageUri);
getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
}
}

此外,如果您打算替换Uri上的图像,请仅请求写入权限,并记住您不能总是获得写入权限。

而且,正如blackapps所指出的,您需要从ACTION_GET_CONTENT切换到ACTION_OPEN_DOCUMENT

相关内容

  • 没有找到相关文章

最新更新