James
15 ottobre 2020
Android 11 ha introdotto diversi aggiornamenti interessanti per gli sviluppatori da integrare nella loro esperienza di app, compresi nuovi controlli per dispositivi e media, supporto migliorato per foldable, e molto altro. Oltre alle nuove caratteristiche ci sono anche diversi miglioramenti della privacy che gli sviluppatori devono integrare nella loro applicazione quando aggiornano e ri-targettizzano ad Android 11. Uno di questi miglioramenti è l’introduzione della visibilità dei pacchetti che altera la capacità di interrogare le applicazioni e i pacchetti installati sul dispositivo di un utente.
Quando si vuole aprire un browser o inviare un’e-mail allora la vostra applicazione dovrà lanciare e interagire con un’altra applicazione sul dispositivo attraverso un Intent
. Prima di chiamare StartActivity
è buona norma QueryIntentActivities
o ResolveActivity
per assicurarsi che ci sia un’applicazione che possa gestire la richiesta. Se stai usando Xamarin.Essentials, allora potresti non aver visto queste API perché la libreria gestisce automaticamente tutta la logica per te per Browser (esterno), Email e SMS.
Prima di Android 11 ogni applicazione poteva facilmente interrogare tutte le applicazioni installate e vedere se una specifica Intent
si sarebbe aperta quando StartActivity
è stata chiamata. Tutto questo è cambiato con Android 11 con l’introduzione della visibilità dei pacchetti. Ora dovrai dichiarare quali intenti e schemi di dati vuoi che la tua applicazione sia in grado di interrogare quando la tua applicazione punta ad Android 11.
Una volta che fai il retarget ad Android 11 ed esegui la tua applicazione su un dispositivo con Android 11, riceverai zero risultati se usi QueryIntentActivities
. Se stai usando Xamarin.Essentials riceverai un FeatureNotSupportedException
quando provi a chiamare una delle API che deve interrogare le attività. Diciamo che state usando la funzione Email di Xamarin.Essentials. Il tuo codice potrebbe assomigliare a questo:
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 }}
Se la tua app mirasse ad Android 10 e precedenti, funzionerebbe semplicemente. Con la visibilità dei pacchetti in Android 11, quando si tenta di inviare un’e-mail, Xamarin.Essentials cercherà di interrogare i pacakge che supportano le e-mail e verranno restituiti zero risultati. Questo si tradurrà in un FeatureNotSupportedException
da lanciare, che non è l’ideale. Per consentire alla vostra applicazione di ottenere la visibilità nei pacchetti è necessario aggiungere un elenco di queries
nel vostro AndroidManifest.xml
.
<manifest package="com.mycompany.myapp"> <queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> </queries></manifest>
Se avete bisogno di interrogare più intenti o utilizzare più API è necessario aggiungerli tutti nella 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>
Ed ecco fatto, con solo una piccola quantità di configurazione la vostra app continuerà a funzionare senza problemi quando vi rivolgerete ad Android 11.
Per saperne di più
Assicuratevi di sfogliare la documentazione ufficiale di Android 11 sulla visibilità dei pacchetti, e naturalmente la documentazione Xamarin.Essentials appena aggiornata. Infine, assicurati di leggere le note di rilascio di Xamarin.Android 11.
James Montemagno
Principal Lead Program Manager, .NET Community
Segui