James
15 października 2020
Android 11 wprowadził kilka ekscytujących aktualizacji dla deweloperów, aby zintegrować się z ich doświadczeniami aplikacji, w tym nowe urządzenia i kontrole mediów, ulepszone wsparcie dla foldables, i wiele więcej. Oprócz nowych funkcji istnieje również kilka ulepszeń prywatności, że deweloperzy muszą zintegrować się z ich aplikacji podczas aktualizacji i ponownego kierowania do Androida 11. Jednym z tych ulepszeń jest wprowadzenie widoczności pakietów, która zmienia zdolność do odpytywania zainstalowanych aplikacji i pakietów na urządzeniu użytkownika.
Gdy chcesz otworzyć przeglądarkę lub wysłać e-mail, wtedy Twoja aplikacja będzie musiała uruchomić i współdziałać z inną aplikacją na urządzeniu poprzez Intent
. Przed wywołaniem StartActivity
najlepszą praktyką jest QueryIntentActivities
lub ResolveActivity
, aby upewnić się, że istnieje aplikacja, która może obsłużyć żądanie. Jeśli używasz Xamarin.Essentials, to możesz nie widzieć tych API, ponieważ biblioteka obsługuje całą logikę dla ciebie automatycznie dla Browser(External), Email, i SMS.
Przed Android 11 każda aplikacja mogła łatwo zapytać wszystkie zainstalowane aplikacje i zobaczyć, czy konkretny Intent
otworzy się, gdy StartActivity
jest wywoływany. To wszystko zmieniło się z Androidem 11 wraz z wprowadzeniem widoczności pakietów. Teraz będziesz musiał zadeklarować, jakie intencje i schematy danych chcesz, aby twoja aplikacja była w stanie zapytać, gdy twoja aplikacja jest ukierunkowana na Androida 11.
Po retargetowaniu do Androida 11 i uruchomieniu aplikacji na urządzeniu z systemem Android 11 otrzymasz zero wyników, jeśli użyjesz QueryIntentActivities
. Jeśli używasz Xamarin.Essentials, otrzymasz FeatureNotSupportedException
, gdy spróbujesz wywołać jeden z interfejsów API, który wymaga zapytania o działania. Załóżmy, że używasz funkcji Email w Xamarin.Essentials. Twój kod może wyglądać tak:
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 }}
Jeśli twoja aplikacja celowała w Androida 10 i wcześniej, to po prostu by działało. Z widocznością pakietów w Androidzie 11, gdy spróbujesz wysłać wiadomość e-mail, Xamarin.Essentials spróbuje zapytać o pakiety, które obsługują pocztę e-mail i zero wyników zostanie zwróconych. Spowoduje to, że FeatureNotSupportedException
zostanie rzucony, co nie jest idealne. Aby umożliwić Twojej aplikacji uzyskanie widoczności w pakietach, będziesz musiał dodać listę queries
do swojego AndroidManifest.xml
.
<manifest package="com.mycompany.myapp"> <queries> <intent> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> </intent> </queries></manifest>
Jeśli potrzebujesz kwerendy wielu intencji lub używasz wielu interfejsów API, będziesz musiał dodać je wszystkie do listy.
<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>
I oto masz, z niewielką ilością konfiguracji twoja aplikacja będzie nadal działać bezbłędnie, gdy celujesz w Androida 11.
Learn More
Pewnie przejrzyj oficjalną dokumentację Androida 11 na temat widoczności pakietów, i oczywiście nowo zaktualizowaną dokumentację Xamarin.Essentials. Na koniec, koniecznie zapoznaj się z uwagami do wydania Xamarin.Android 11.
James Montemagno
Principal Lead Program Manager, .NET Community
Follow
.