¿Cómo startActivityForResult en Android 11?
Estoy cargando imágenes en mi aplicación startActivityForResult()haciendo algo como esto:
val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
if (intentForLoadingImage.resolveActivity(packageManager) != null) {
startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
}
He anulado onActivityResult()mi lógica para cargar la imagen en un ImageView. Funciona en todas las versiones de Android (el minSdkVersion de mi aplicación es 21) pero no hace absolutamente nada en Android 11. Porque intentForLoadingImage.resolveActivity(packageManager)devuelve nulo y la actividad para cargar imágenes no se inicia.
Respuestas
Según la ACTION_GET_CONTENTdocumentación , la cadena real es android.intent.action.GET_CONTENTy no la android.media.action.GET_CONTENT que tiene en su código. Por lo tanto, la consulta de visibilidad de paquete correcta es
<queries>
<intent>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:mimeType="image/*"/>
</intent>
</queries>
Como alternativa, también puede detectar lo ActivityNotFoundExceptionque ocurre en el raro caso de que Storage Access Framework (que es lo que maneja ACTION_GET_CONTENT) se haya deshabilitado como parte de una ROM personalizada. Este enfoque no requiere etiquetas de visibilidad de paquetes:
val intentForLoadingImage = Intent(Intent.ACTION_GET_CONTENT)
intentForLoadingImage.type = "image/*"
try {
startActivityForResult(intentForLoadingImage, IMAGE_REQUEST_CODE)
} catch (e: ActivityNotFoundException) {
}
Aprendí sobre actualizaciones de privacidad de visibilidad de paquetes en Android 11 . Que dice
Android 11 cambia la forma en que las aplicaciones pueden consultar e interactuar con otras aplicaciones que el usuario ha instalado en un dispositivo. Usando el elemento, las aplicaciones pueden definir el conjunto de otros paquetes a los que pueden acceder. Este elemento ayuda a fomentar el principio de privilegio mínimo al indicarle al sistema qué otros paquetes hacer visibles para su aplicación, y ayuda a las tiendas de aplicaciones como Google Play a evaluar la privacidad y seguridad que su aplicación proporciona a los usuarios.
Si su aplicación apunta a Android 11 o superior, es posible que deba agregar el elemento en el archivo de manifiesto de su aplicación. Dentro del elemento, puede especificar paquetes por nombre, por firma de intención o por autoridad del proveedor.
Entonces, agregué las siguientes etiquetas en mi archivo de manifiesto:
<queries>
<intent>
<action android:name="android.intent.action.GET_CONTENT" />
<data android:mimeType="image/*"/>
</intent>
</queries>
¡Y eso es!