Как правильно установить Uri изображения из папки, выбранной пользователем, для отображения в ImageView? - PullRequest
0 голосов
/ 31 мая 2019

Мне нужно отобразить изображение, для которого я знаю имя файла, но я не знаю папку, которую должен указать пользователь.

Я использую Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);, чтобы получить папку от пользователя. Возвращает Uri с путем вдоль этих линий:

Содержание: //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: неверный URI: content: //com.android.externalstorage.documents/tree/primary%3ADownload/image.png

Замена %3A на : не работает.

Как правильно настроить Uri для отображения изображения?

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Мне удалось добиться того, чего я хотел, с помощью InputStream.

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

Чтобы работать, imageUri должен быть Uri в соответствии с:

Содержание: //com.android.externalstorage.documents/document/primary: Скачать / image.png

Однако это означает, что вы будете получать доступ к файлам, у которых у вас нет разрешений по умолчанию. Это означает, что вам придется иметь дело с получением разрешения.

Это не то, что я хотел, поэтому я отказался от этого подхода.

0 голосов
/ 31 мая 2019

Я думаю, вы должны использовать file path, а не URI.content:// 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"));
...