Как правильно установить Uri изображения из папки, выбранной пользователем для отображения в ImageView?

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

Я использую Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);, чтобы получить папку от пользователя. Он возвращает 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 для отображения изображения?

изображение, которое вы хотите показать, выбрано из галереи, верно?

ismail alaoui 31.05.2019 05:33

Нет, пользователь выбирает только папку. У меня есть имена изображений в базе данных.

André Santaló 31.05.2019 05:34
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
644
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

я думаю, вы должны использовать 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"));
Ответ принят как подходящий

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

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

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

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

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

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

Другие вопросы по теме