如何正确设置用户选择的文件夹中图像的 Uri 以显示在 ImageView 中?

How to correctly set the Uri of an image from a folder selected by the user to show in an ImageView?

我需要显示一个我知道文件名但不知道文件夹的图像,必须由用户指定。

我使用 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 从用户那里获取文件夹。它 returns 一个 Uri 具有沿着这些线的路径:

content://com.android.externalstorage.documents/tree/primary%3ADownload

现在我需要在 ImageView 中显示此文件夹中的图像。我尝试了以下方法:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), 
Uri.parse(chosenFolder + "/image.png"));
ImageView imageView = findViewById(R.id.imageview);
imageView.setImageBitmap(bitmap);

第一行抛出如下异常:

java.lang.IllegalArgumentException: Invalid URI: content://com.android.externalstorage.documents/tree/primary%3ADownload/image.png

%3A 替换为 : 无效。

如何正确设置Uri来显示图片?

我认为你应该使用 file path 而不是 URIcontent:// Uri 不必表示文件系统上的文件。

试试这个:

String filePath = null;
if (chosenFolder != null && "content".equals(chosenFolder.getScheme())) {
    Cursor cursor = this.getContentResolver().query(chosenFolder, new String[] { android.provider.MediaStore.Images.ImageColumns.DATA }, null, null, null);
    cursor.moveToFirst();   
    filePath = cursor.getString(0);
    cursor.close();
} else {
    filePath = chosenFolder.getPath();
}

然后用文件路径创建位图:

Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), 
Uri.parse(filepath+ "/image.png"));

我设法用 InputStream 实现了我想要的。

InputStream is = getContentResolver().openInputStream(imageUri);
Bitmap bitmap = BitmapFactory.decodeStream(is);

要工作,imageUri 必须是符合以下行的 Uri:

content://com.android.externalstorage.documents/document/primary:Download/image.png

但是,这意味着您将访问默认情况下您没有权限的文件。这意味着您将不得不处理获得许可的问题。

这不是我想要的,所以我放弃了这种方法。