Как запуститьActivityForResult на Android 11?

Я загружаю изображения в свое приложение, используя startActivityForResult(), делая что-то вроде этого:

val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
if (intentForLoadingImage.resolveActivity(packageManager) != null) {
    startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
}

Я переопределил onActivityResult() своей логикой загрузки изображения в ImageView. Он работает на всех версиях Android (minSdkVersion моего приложения равен 21), но абсолютно ничего не делает на Android 11. Поскольку intentForLoadingImage.resolveActivity(packageManager) возвращает значение null, и активность загрузки изображений не начинается.


person Abhishek Choudhary    schedule 15.10.2020    source источник


Ответы (2)


Я узнал об обновлениях конфиденциальности видимости пакетов в Android 11. Что говорит,

Android 11 меняет то, как приложения могут запрашивать и взаимодействовать с другими приложениями, которые пользователь установил на устройстве. С помощью этого элемента приложения могут определять набор других пакетов, к которым у них есть доступ. Этот элемент помогает поддерживать принцип наименьших привилегий, сообщая системе, какие другие пакеты сделать видимыми для вашего приложения, и помогает магазинам приложений, таким как Google Play, оценивать конфиденциальность и безопасность, которые ваше приложение обеспечивает для пользователей.

Если ваше приложение предназначено для Android 11 или более поздней версии, вам может потребоваться добавить элемент в файл манифеста вашего приложения. Внутри элемента вы можете указать пакеты по имени, подписи намерения или полномочиям поставщика.

Итак, я добавил следующие теги в свой файл манифеста:

<queries>
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*"/>
    </intent>
</queries>

И это все!

person Abhishek Choudhary    schedule 18.10.2020

Согласно ACTION_GET_CONTENT документации, фактическая строка android.intent.action.GET_CONTENT и нет android.media.action.GET_CONTENT того, что есть в вашем коде. Поэтому правильный запрос видимости пакета

<queries>
    <intent>
        <action android:name="android.intent.action.GET_CONTENT" />
        <data android:mimeType="image/*"/>
    </intent>
</queries>

В качестве альтернативы вы также можете поймать ActivityNotFoundException, который возникает в редких случаях, когда Платформа доступа к хранилищу (которая обрабатывает ACTION_GET_CONTENT) была отключена как часть пользовательского ПЗУ. Этот подход не требует тегов видимости пакета:

val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
try {
    startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
} catch (e: ActivityNotFoundException) {
}
person ianhanniballake    schedule 15.10.2020