James
El 15 de octubre de 2020
Android 11 introdujo varias actualizaciones interesantes para que los desarrolladores las integren en su experiencia de aplicación, incluyendo nuevos controles de dispositivos y medios, soporte mejorado para los plegables y mucho más. Además de las nuevas características, también hay varias mejoras de privacidad que los desarrolladores deben integrar en su aplicación cuando se actualicen y vuelvan a dirigirse a Android 11. Una de esas mejoras es la introducción de la visibilidad de los paquetes que altera la capacidad de consultar las aplicaciones y paquetes instalados en el dispositivo de un usuario.
Cuando quieras abrir un navegador o enviar un correo electrónico entonces tu aplicación tendrá que lanzar e interactuar con otra aplicación en el dispositivo a través de un Intent
. Antes de llamar a StartActivity
es la mejor práctica para QueryIntentActivities
o ResolveActivity
para asegurarse de que hay una aplicación que puede manejar la solicitud. Si utilizas Xamarin.Essentials, es posible que no hayas visto estas APIs porque la librería maneja toda la lógica por ti de forma automática para el navegador (externo), el correo electrónico y los SMS.
Antes de Android 11 cada aplicación podía consultar fácilmente todas las aplicaciones instaladas y ver si un Intent
específico se abría cuando se llamaba a StartActivity
. Todo esto ha cambiado con Android 11 con la introducción de la visibilidad de los paquetes. Ahora tendrás que declarar qué intents y esquemas de datos quieres que tu aplicación pueda consultar cuando tu aplicación esté orientada a Android 11.
Una vez que reorientes a Android 11 y ejecutes tu aplicación en un dispositivo que ejecute Android 11, recibirás cero resultados si utilizas QueryIntentActivities
. Si estás usando Xamarin.Essentials recibirás un FeatureNotSupportedException
cuando intentes llamar a una de las APIs que necesitan consultar actividades. Digamos que está utilizando la función de correo electrónico de Xamarin.Essentials. Su código puede tener este aspecto:
public async Task SendEmail(string subject, string body, List<string> recipients){ try { var message = new EmailMessage { Subject = subject, Body = body, To = recipients }; await Email.ComposeAsync(message); } catch (FeatureNotSupportedException fbsEx) { // Email is not supported on this device } catch (Exception ex) { // Some other exception occurred }}
Si su aplicación se dirigiera a Android 10 y anteriores, simplemente funcionaría. Con la visibilidad de los paquetes en Android 11, cuando intente enviar un correo electrónico, Xamarin.Essentials intentará consultar los paquetes que admiten el correo electrónico y devolverá cero resultados. Esto hará que se lance un FeatureNotSupportedException
, lo que no es ideal. Para permitir que su aplicación obtenga visibilidad en los paquetes, tendrá que añadir una lista de queries
en su AndroidManifest.xml
.
<manifest package="com.mycompany.myapp"> <queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> </queries></manifest>
Si necesita consultar varios intentos o utilizar varias API, tendrá que añadirlos todos en la lista.
<queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="http"/> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="https"/> </intent> <intent> <action android:name="android.intent.action.VIEW" /> <data android:scheme="smsto"/> </intent></queries>
Y ahí lo tienes, con solo una pequeña configuración tu aplicación seguirá funcionando sin problemas cuando te dirijas a Android 11.
Aprende más
Asegúrate de consultar la documentación oficial de Android 11 sobre la visibilidad de los paquetes y, por supuesto, la documentación recién actualizada de Xamarin.Essentials. Por último, asegúrese de leer las notas de la versión de Xamarin.Android 11.
James Montemagno
Administrador principal de programas, comunidad .NET
Siga
.