Как выбрать изображение из общего хранилища на устройстве Android 11?
Я использовал эту библиотеку https://github.com/Dhaval2404/ImagePicker, и я получил предупреждение от игровой консоли Android, команда Мы обнаружили, что ваше приложение содержит флаг requestLegacyExternalStorage в файле манифеста одного или нескольких ваших пакетов приложений. или APK. Разработчики приложений на устройствах под управлением Android 11+ должны использовать Scoped Storage, чтобы предоставить пользователям лучший контроль доступа к хранилищу своего устройства. Чтобы выпустить приложение на Android 11 или новее после 5 мая, вам необходимо:
3 ответа
Легкий.
val REQUEST_CODE_PICK_PHOTO = 1
pickPhotoButton.setOnClickListener {
val intent = Intent(Intent.ACTION_PICK)
intent.type = "image/*"
startActivityForResult(intent, REQUEST_CODE_PICK_PHOTO)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_CODE_PICK_PHOTO && resultCode == RESULT_OK) {
val selectedImageUri = data!!.data!!
//do something with this image uri
}
}
До Android 10 у нас была концепция общего хранилища. Каждое приложение на устройстве имеет частное хранилище во внутренней памяти, и вы можете найти его в каталоге android / data / your_package_name.. Помимо этого внутреннего хранилища, остальная часть хранилища называется общим хранилищем, то есть каждое приложение с разрешением на хранилище может получить доступ к этой части памяти. Сюда входят медиаколлекции и другие файлы различных приложений. Но проблема в том, что приложению, имеющему разрешение на хранение, не требуется доступ ко всем этим файлам. Все, что они хотят, - это выполнить небольшую операцию над небольшой частью памяти, и все. Например, какому-то приложению нужно просто выбрать изображение пользователя, чтобы загрузить его в качестве изображения профиля, и ничего больше. Итак, зачем предоставлять им полный доступ к этому общему хранилищу?
Кроме того, вторая проблема заключается в том, что, когда приложение имеет такую широкую возможность записи в хранилище, файлы, сгенерированные приложением, разбросаны, и когда пользователь удаляет приложение, файлы, сгенерированные приложением, остаются только в хранилище и не удаляется и занимает много места.
Итак, нам нужен какой-то механизм, с помощью которого приложения могут получить определенный доступ, в котором они нуждаются, без таких широких возможностей чтения и записи, которые им на самом деле не нужны. Это можно сделать с помощью Scoped Storage .
Примечание: - Начиная с Android 11 и далее, Google заставляет использовать Scope Storage. Проверьте эту ссылку.
<queries>
<intent>
<action android:name="android.intent.action.PICK" />
</intent>
используйте этот код в файле манифеста...