Рассмотрите возможность внедрения приложения, которое позволит пользователям выбирать изображения, снятые камерой, из Галереи, а затем использовать эти изображения в приложении.
Настройки проекта
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)?
Какие разрешения необходимы для создания растрового изображения?
Если у 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
для поставляемого MediaStore
Uri
, зависит от версии ОС. В последних версиях Android это может быть PhotoPicker — я не использовал ACTION_PICK
серьезно уже несколько лет.
API PhotoPicker:
Поддерживает несколько изображений, чего ACTION_PICK
нет.
Поддерживает облачных провайдеров (иногда), что ACTION_PICK
может быть, а может и нет.