James
15 oktober 2020
Android 11 introducerade flera spännande uppdateringar för utvecklare som kan integrera dem i sin appupplevelse, bland annat nya enhets- och mediakontroller, förbättrat stöd för vikbara enheter och mycket mer. Förutom nya funktioner finns det också flera integritetsförbättringar som utvecklare måste integrera i sin applikation när de uppgraderar och återanpassar till Android 11. En av dessa förbättringar är införandet av paketsynlighet som ändrar möjligheten att fråga efter installerade applikationer och paket på en användares enhet.
När du vill öppna en webbläsare eller skicka ett e-postmeddelande måste din applikation starta och interagera med en annan applikation på enheten via en Intent
. Innan du anropar StartActivity
är det bäst att QueryIntentActivities
eller ResolveActivity
för att säkerställa att det finns en applikation som kan hantera begäran. Om du använder Xamarin.Essentials kanske du inte har sett dessa API:er eftersom biblioteket hanterar all logik automatiskt för webbläsaren (extern), e-post och SMS.
För Android 11 kunde varje app enkelt fråga efter alla installerade program och se om en viss Intent
skulle öppnas när StartActivity
anropas. Allt detta har ändrats med Android 11 i och med införandet av paketens synlighet. Du måste nu deklarera vilka intentioner och datasystem du vill att din app ska kunna fråga efter när din app är inriktad på Android 11.
När du återinriktar dig på Android 11 och kör din applikation på en enhet som kör Android 11 kommer du att få noll resultat om du använder QueryIntentActivities
. Om du använder Xamarin.Essentials får du ett FeatureNotSupportedException
när du försöker anropa ett av API:erna som behöver fråga efter aktiviteter. Låt oss säga att du använder e-postfunktionen i Xamarin.Essentials. Din kod kan se ut så här:
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 }}
Om din app riktade sig till Android 10 och tidigare skulle det bara fungera. Med paketsynlighet i Android 11 när du försöker skicka ett e-postmeddelande kommer Xamarin.Essentials att försöka fråga efter paket som stöder e-post och noll resultat kommer att returneras. Detta kommer att resultera i att en FeatureNotSupportedException
kastas, vilket inte är idealiskt. För att din applikation ska kunna få synlighet i paketen måste du lägga till en lista med 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>
Om du behöver fråga flera intentioner eller använda flera API:er måste du lägga till dem alla i listan.
<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>
Och där har du det, med bara en liten mängd konfiguration kommer din app att fortsätta fungera felfritt när du siktar in dig på Android 11.
Lär dig mer
Se till att bläddra igenom den officiella Android 11-dokumentationen om paketens synlighet och naturligtvis den nyligen uppdaterade dokumentationen om Xamarin.Essentials. Se slutligen till att läsa igenom Xamarin.Android 11 release notes.
James Montemagno
Principal Lead Program Manager, .NET Community
Följ
.