Как выбрать изображение из общего хранилища на устройстве 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      
    }
}

Демо: https://youtu.be/LFfWnt77au8

  • До Android 10 у нас была концепция общего хранилища. Каждое приложение на устройстве имеет частное хранилище во внутренней памяти, и вы можете найти его в каталоге android / data / your_package_name.. Помимо этого внутреннего хранилища, остальная часть хранилища называется общим хранилищем, то есть каждое приложение с разрешением на хранилище может получить доступ к этой части памяти. Сюда входят медиаколлекции и другие файлы различных приложений. Но проблема в том, что приложению, имеющему разрешение на хранение, не требуется доступ ко всем этим файлам. Все, что они хотят, - это выполнить небольшую операцию над небольшой частью памяти, и все. Например, какому-то приложению нужно просто выбрать изображение пользователя, чтобы загрузить его в качестве изображения профиля, и ничего больше. Итак, зачем предоставлять им полный доступ к этому общему хранилищу?

  • Кроме того, вторая проблема заключается в том, что, когда приложение имеет такую ​​широкую возможность записи в хранилище, файлы, сгенерированные приложением, разбросаны, и когда пользователь удаляет приложение, файлы, сгенерированные приложением, остаются только в хранилище и не удаляется и занимает много места.

  • Итак, нам нужен какой-то механизм, с помощью которого приложения могут получить определенный доступ, в котором они нуждаются, без таких широких возможностей чтения и записи, которые им на самом деле не нужны. Это можно сделать с помощью Scoped Storage .

Примечание: - Начиная с Android 11 и далее, Google заставляет использовать Scope Storage. Проверьте эту ссылку.

      <queries>
<intent>
    <action android:name="android.intent.action.PICK" />
</intent>

используйте этот код в файле манифеста...

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