James
15. oktober 2020
Android 11 introducerede flere spændende opdateringer, som udviklere kan integrere i deres appoplevelse, herunder nye enheds- og mediekontroller, forbedret understøttelse for foldbare enheder og meget mere. Ud over nye funktioner er der også adskillige forbedringer af privatlivets fred, som udviklere skal integrere i deres applikation, når de opgraderer og re-targeting til Android 11. En af disse forbedringer er indførelsen af pakkesynlighed, der ændrer muligheden for at forespørge på installerede programmer og pakker på en brugers enhed.
Når du vil åbne en browser eller sende en e-mail, skal din applikation starte og interagere med en anden applikation på enheden via en Intent
. Inden du kalder StartActivity
, er det bedste praksis at QueryIntentActivities
eller ResolveActivity
for at sikre, at der er et program, der kan håndtere anmodningen. Hvis du bruger Xamarin.Essentials, har du måske ikke set disse API’er, fordi biblioteket håndterer al logikken for dig automatisk for Browser(External), E-mail og SMS.
Forud for Android 11 kunne alle apps nemt forespørge alle installerede programmer og se, om en bestemt Intent
ville blive åbnet, når StartActivity
blev kaldt. Det er alt sammen ændret med Android 11 med indførelsen af pakkesynlighed. Du skal nu erklære, hvilke intentioner og dataskemaer du vil have, at din app skal kunne forespørge, når din app er målrettet Android 11.
Når du har retargetet til Android 11 og kørt din applikation på en enhed, der kører Android 11, vil du få nul resultater, hvis du bruger QueryIntentActivities
. Hvis du bruger Xamarin.Essentials, vil du modtage et FeatureNotSupportedException
, når du forsøger at kalde en af de API’er, der skal forespørge aktiviteter. Lad os sige, at du bruger e-mailfunktionen i Xamarin.Essentials. Din kode kan se således ud:
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 }}
Hvis din app var rettet mod Android 10 og tidligere, ville det bare virke. Med pakkesynlighed i Android 11, når du forsøger at sende en e-mail, vil Xamarin.Essentials forsøge at forespørge efter pacakges, der understøtter e-mail, og nul resultater vil blive returneret. Dette vil resultere i en FeatureNotSupportedException
at blive kastet, hvilket ikke er ideelt. For at gøre det muligt for din applikation at få synlighed i pakkerne skal du tilføje en liste af queries
i din AndroidManifest.xml
.
<manifest package="com.mycompany.myapp"> <queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> </queries></manifest>
Hvis du har brug for at forespørge flere intentioner eller bruge flere API’er, skal du tilføje dem alle i listen.
<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>
Og der har du det, med blot en lille mængde konfiguration vil din app fortsat fungere upåklageligt, når du målretter Android 11.
Lær mere
Sørg for at gennemse den officielle Android 11-dokumentation om pakkesynlighed og selvfølgelig den nyligt opdaterede Xamarin.Essentials-dokumentation. Endelig skal du sørge for at læse Xamarin.Android 11-udgivelsesbemærkningerne.
James Montemagno
Principal Lead Program Manager, .NET Community
Følg