Необходимы разрешения для чтения изображения из галереи с использованием MediaStore API

Рассмотрите возможность внедрения приложения, которое позволит пользователям выбирать изображения, снятые камерой, из Галереи, а затем использовать эти изображения в приложении.

Настройки проекта

targetSdk=34, compileSdk=34, minSdk=22

Используя MediaStore API, можно запустить сборщик

startActivityForResult(Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) ,1);

а затем получить изображение в onActivityResult()

override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
    super.onActivityResult(requestCode, resultCode, intent)
    val uri = intent!!.data!!
    val inputStream = contentResolver.openInputStream(uri)!!
    val bitmapBytes = inputStream.readBytes()
    val bitmap = BitmapFactory.decodeByteArray(bitmapBytes, 0, bitmapBytes.size)
}

Вопрос 1: Какие разрешения необходимы для создания растрового изображения? Читая спецификации кажется, что READ_EXTERNAL_STORAGE понадобится. Но код работает без какого-либо разрешения в SDK 34-24 и запускается только с требованием READ_EXTERNAL_STORAGE в <= SDK 23.

Вопрос 2: Почему READ_MEDIA_IMAGES не требуется в >= SDK 33? Как указано в других спецификациях, для реализации требуется разрешение на чтение изображений, созданных другим приложением на SDK 33 и более поздних версиях.

Вопрос 3: В чем преимущество использования PhotoPicker API (вместо MediaStore)?

1
0
107
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Какие разрешения необходимы для создания растрового изображения?

Если у Uri есть схема content (а все они должны быть в современных версиях Android), у вас уже должно быть разрешение, любезно предоставленное пользователем, участвующим в выборе через ACTION_PICK.

запускается только с требованием READ_EXTERNAL_STORAGE на <= SDK 23

Вероятно, ваш Uri имеет схему file на тех старых устройствах.

Почему READ_MEDIA_IMAGES не требуется в >= SDK 33?

См. выше.

В чем преимущество использования PhotoPicker API (вместо MediaStore)?

Вы не используете MediaStore. Вы используете ACTION_PICK. То, что обрабатывает ACTION_PICK для поставляемого MediaStoreUri, зависит от версии ОС. В последних версиях Android это может быть PhotoPicker — я не использовал ACTION_PICK серьезно уже несколько лет.

API PhotoPicker:

  • Поддерживает несколько изображений, чего ACTION_PICK нет.

  • Поддерживает облачных провайдеров (иногда), что ACTION_PICK может быть, а может и нет.

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