Android 11 wprowadza nowe funkcje i interfejsy API dla deweloperów. W sekcjach poniżej znajdziesz informacje o funkcjach aplikacji i dowiesz się, jak zacząć korzystać z powiązanych interfejsów API.
Szczegółową listę nowych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie o różnicach w interfejsach API. Szczegółowe informacje o nowych interfejsach API znajdziesz w dokumentacji interfejsu API Androida. Nowe interfejsy API są wyróżnione, aby były lepiej widoczne. Aby dowiedzieć się więcej o obszarach, w których zmiany na platformie mogą mieć wpływ na Twoje aplikacje, zapoznaj się ze zmianami w zachowaniu Androida 11 w przypadku aplikacji kierowanych na Androida R i wszystkich aplikacji, a także ze zmianami dotyczącymi prywatności.
Nowe funkcje
Sterowanie urządzeniami
Android 11 zawiera nowy interfejs ControlsProviderService
API, który umożliwia udostępnianie elementów sterujących podłączonym urządzeniom zewnętrznym. Te elementy sterujące
są widoczne w menu zasilania Androida w sekcji Elementy sterujące urządzeniem. Więcej informacji znajdziesz w artykule Kontrolowanie urządzeń zewnętrznych.
Sterowanie multimediami
Android 11 zmienia sposób wyświetlania elementów sterujących multimediami. Elementy sterujące multimediami pojawią się w pobliżu szybkich ustawień. Sesje z różnych aplikacji są ułożone w przesuwany karuzel, który zawiera strumienie odtwarzane lokalnie na telefonie, strumienie zdalne, takie jak te wykryte na urządzeniach zewnętrznych lub sesje przesyłania, oraz poprzednie sesje, które można wznowić, w kolejności, w jakiej były ostatnio odtwarzane.
Użytkownicy mogą ponownie uruchamiać poprzednie sesje z karuzeli bez konieczności uruchamiania aplikacji. Po rozpoczęciu odtwarzania użytkownik wchodzi w interakcję z elementami sterującymi multimediami w zwykły sposób.
Więcej informacji znajdziesz w artykule o elementach sterujących multimediami.
Ekrany
Lepsza obsługa wyświetlaczy kaskadowych
Android 11 udostępnia kilka interfejsów API do obsługi wyświetlaczy typu waterfall, czyli wyświetlaczy, które
owijają się wokół krawędzi urządzenia. Są one traktowane jako wariant wyświetlaczy z wycięciami. Obecne metody
DisplayCutout
.getSafeInset…()
zwracają teraz bezpieczne wcięcie, aby uniknąć obszarów kaskadowych i wycięć.
Aby renderować treści aplikacji w obszarze wodospadu:
Zadzwoń pod numer
DisplayCutout.getWaterfallInsets()
, aby poznać dokładne wymiary wkładki wodospadu.Ustaw atrybut układu okna
layoutInDisplayCutoutMode
naLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
tak, aby okno mogło rozciągać się na obszary wycięcia i zaokrąglenia na wszystkich krawędziach ekranu. Musisz zadbać o to, aby żadne istotne treści nie znajdowały się w obszarach wycięcia ani w obszarach z efektem wodospadu.
Czujnik kąta zawiasu i urządzenia składane
Android 11 umożliwia aplikacjom działającym na urządzeniach z ekranami z zawiasami określanie kąta zawiasu. W tym celu udostępnia nowy czujnik z TYPE_HINGE_ANGLE
i nowy SensorEvent
, który może monitorować kąt zawiasu i podawać pomiar w stopniach między 2 integralnymi częściami urządzenia. Możesz używać tych surowych pomiarów do tworzenia szczegółowych animacji podczas manipulowania urządzeniem przez użytkownika.
Zobacz urządzenia składane.
Rozmowy
Ulepszenia w rozmowach
Android 11 wprowadza szereg ulepszeń w sposobie obsługi rozmów. Rozmowy to dwukierunkowa komunikacja w czasie rzeczywistym między co najmniej 2 osobami. Te rozmowy są specjalnie wyróżnione, a użytkownicy mają kilka nowych opcji interakcji z nimi.
Więcej informacji o rozmowach i o tym, jak Twoja aplikacja może je obsługiwać, znajdziesz w artykule Osoby i rozmowy.
Dymki czatu
Dymki są teraz dostępne dla programistów, aby ułatwić wyświetlanie rozmów w systemie. Dymki to eksperymentalna funkcja w Androidzie 10, którą można było włączyć w opcjach programisty. W Androidzie 11 nie jest to już konieczne.
Jeśli aplikacja jest kierowana na Androida 11 (poziom API 30) lub nowszego, jej powiadomienia nie są wyświetlane jako dymki, chyba że spełniają nowe wymagania dotyczące konwersacji. W szczególności powiadomienie musi być powiązane ze skrótem.
Przed Androidem 11, jeśli powiadomienie miało być wyświetlane w formie dymka, trzeba było wyraźnie określić, że ma być zawsze uruchamiane w trybie interfejsu dokumentu. Od Androida 11 nie musisz już wyraźnie ustawiać tego ustawienia. Jeśli powiadomienie jest wyświetlane w formie dymka, platforma automatycznie ustawia je tak, aby zawsze uruchamiało się w trybie interfejsu dokumentu.
Wprowadziliśmy kilka ulepszeń dotyczących wydajności dymków, a użytkownicy mają większą swobodę w zakresie włączania i wyłączania dymków w poszczególnych aplikacjach. W przypadku deweloperów, którzy wdrożyli eksperymentalną obsługę, w Androidzie 11 wprowadziliśmy kilka zmian w interfejsach API:
- Konstruktor
BubbleMetadata.Builder()
bez parametrów został wycofany. Zamiast tego użyj jednego z 2 nowych konstruktorów:BubbleMetadata.Builder(PendingIntent, Icon)
lubBubbleMetadata.Builder(String)
. - Utwórz
BubbleMetadata
na podstawie identyfikatora skrótu, wywołującBubbleMetadata.Builder(String)
. Przekazywany ciąg znaków powinien być zgodny z identyfikatorem skrótu podanym wNotification.Builder
. - Utwórz ikony dymków za pomocą funkcji
Icon.createWithContentUri()
lub nowej metodycreateWithAdaptiveBitmapContentUri()
.
Wskaźniki wizualne sieci 5G
Informacje o wyświetlaniu wskaźników 5G na urządzeniach użytkowników znajdziesz w artykule Informowanie użytkowników o korzystaniu z sieci 5G.
Prywatność
Android 11 wprowadza wiele zmian i ograniczeń, które zwiększają prywatność użytkowników. Więcej informacji znajdziesz na stronie Prywatność.
Bezpieczeństwo
Aktualizacje dotyczące uwierzytelniania biometrycznego
Aby pomóc Ci kontrolować poziom bezpieczeństwa danych aplikacji, Android 11 wprowadza kilka ulepszeń w zakresie uwierzytelniania biometrycznego. Te zmiany są też widoczne w bibliotece Jetpack Biometric.
Typy uwierzytelniania
Android 11 wprowadza interfejs BiometricManager.Authenticators
, którego możesz używać do deklarowania typów uwierzytelniania obsługiwanych przez Twoją aplikację.
Określanie użytego typu uwierzytelniania
Po uwierzytelnieniu użytkownika możesz sprawdzić, czy uwierzytelnienie zostało przeprowadzone za pomocą danych logowania urządzenia czy danych biometrycznych, wywołując metodę getAuthenticationType()
.
Dodatkowa obsługa kluczy uwierzytelniania do jednorazowego użycia
Android 11 zapewnia większą obsługę uwierzytelniania za pomocą kluczy uwierzytelniania jednorazowego.
Wycofane metody
Android 11 wycofuje te metody:
- Metoda
setDeviceCredentialAllowed()
. - Metoda
setUserAuthenticationValidityDurationSeconds()
. - Przeciążona wersja funkcji
canAuthenticate()
, która nie przyjmuje argumentów.
Bezpieczne udostępnianie dużych zbiorów danych
W niektórych sytuacjach, np. związanych z uczeniem maszynowym lub odtwarzaniem multimediów, aplikacja może chcieć używać tego samego dużego zbioru danych co inna aplikacja. W poprzednich wersjach Androida aplikacja i inna aplikacja musiały pobrać oddzielną kopię tego samego zbioru danych.
Aby zmniejszyć nadmiarowość danych zarówno w sieci, jak i na dysku, Android 11 umożliwia buforowanie tych dużych zbiorów danych na urządzeniu za pomocą wspólnych obiektów danych. Więcej informacji o udostępnianiu zbiorów danych znajdziesz w szczegółowym przewodniku na temat udostępniania dużych zbiorów danych.
Przeprowadzanie szyfrowania opartego na plikach po ponownym uruchomieniu OTA bez danych logowania użytkownika
Po zakończeniu aktualizacji OTA i ponownym uruchomieniu urządzenia klucze szyfrowane za pomocą danych logowania (CE) umieszczone w pamięci chronionej za pomocą danych logowania są natychmiast dostępne do operacji szyfrowania opartego na plikach (FBE). Oznacza to, że po aktualizacji OTA aplikacja może wznowić działania wymagające kluczy CE, zanim użytkownik wpisze kod PIN, hasło lub narysuje wzór.
Skuteczność i jakość
Debugowanie bezprzewodowe
Android 11 obsługuje wdrażanie i debugowanie aplikacji bezprzewodowo z stacji roboczej za pomocą Android Debug Bridge (adb). Możesz na przykład wdrożyć aplikację z możliwością debugowania na wielu urządzeniach zdalnych bez fizycznego podłączania urządzenia przez USB i rozwiązywania typowych problemów z połączeniem USB, takich jak instalacja sterownika. Więcej informacji znajdziesz w artykule Uruchamianie aplikacji na urządzeniu.
Instalacja przyrostowa pliku APK za pomocą ADB
Instalowanie na urządzeniu dużych plików APK (o rozmiarze powyżej 2 GB) może zająć dużo czasu, nawet jeśli w aplikacji wprowadzono tylko niewielkie zmiany. Przyrostowa instalacja plików APK za pomocą ADB (Android Debug Bridge) przyspiesza ten proces, ponieważ instaluje wystarczającą część pliku APK, aby można było uruchomić aplikację, a pozostałe dane przesyła w tle. adb install
będzie automatycznie korzystać z tej funkcji, jeśli jest ona obsługiwana przez urządzenie i masz zainstalowany najnowszy pakiet SDK Platform-Tools. Jeśli nie jest obsługiwana, domyślna metoda instalacji jest używana w trybie cichym.
Aby użyć tej funkcji, użyj tego polecenia adb. Jeśli urządzenie nie obsługuje instalacji przyrostowej, polecenie zakończy się niepowodzeniem i wyświetli szczegółowe wyjaśnienie.
adb install --incremental
Zanim uruchomisz przyrostową instalację pliku APK za pomocą ADB, musisz podpisać plik APK i utworzyć plik schematu podpisu APK w wersji 4. Aby ta funkcja działała, plik podpisu w wersji 4 musi znajdować się obok pliku APK.
Wykrywanie błędów za pomocą natywnego alokatora pamięci
GWP-ASan to funkcja natywnego alokatora pamięci, która pomaga znajdować błędy odwołania do pamięci po jej zwolnieniu (use-after-free) i przepełnienia bufora na stercie (heap-buffer-overflow). Możesz włączyć tę funkcję globalnie lub w przypadku konkretnych podprocesów aplikacji. Więcej informacji znajdziesz w przewodniku po GWP-Asan.
Neural Networks API 1.3
Android 11 rozszerza i ulepsza interfejs Neural Networks API (NNAPI).
Nowe operacje
NNAPI 1.3 wprowadza nowy typ operandu, TENSOR_QUANT8_ASYMM_SIGNED
, aby obsługiwać nowy schemat kwantyzacji TensorFlow Lite.
Dodatkowo NNAPI 1.3 wprowadza te nowe operacje:
QUANTIZED_LSTM
IF
WHILE
ELU
HARD_SWISH
FILL
RANK
Nowe opcje ML
NNAPI 1.3 wprowadza nowe ustawienia, które pomagają w płynnym działaniu uczenia maszynowego:
Interfejs QoS API: nowy interfejs Quality of Service API obsługuje priorytetyzację i terminy zadań w NNAPI. Zawiera te nowe funkcje:
Dane wejściowe/wyjściowe domeny pamięci: NNAPI 1.3 obsługuje domeny pamięci jako dane wejściowe i wyjściowe wykonywania. Usuwa to niepotrzebne kopie tych samych danych z różnych komponentów systemu, co zwiększa wydajność działania sieci neuronowych Androida. Ta funkcja dodaje zestaw nowych interfejsów API NDK do użycia z obiektami
ANeuralNetworksMemoryDesc
iANeuralNetworkMemory
, w tym te funkcje:ANeuralNetworksMemoryDesc_create()
ANeuralNetworksMemoryDesc_free()
ANeuralNetworksMemoryDesc_addInputRole()
ANeuralNetworksMemoryDesc_addOutputRole()
ANeuralNetworksMemoryDesc_setDimensions()
ANeuralNetworksMemoryDesc_finish()
ANeuralNetworksMemory_createFromDesc()
ANeuralNetworksMemory_copy()
Więcej informacji znajdziesz w przykładzie domeny pamięci sieci neuronowej.
Obsługa interfejsu Dependency API i synchronizacji: NNAPI 1.3 obsługuje obliczenia asynchroniczne z zależnościami, co znacznie zmniejsza obciążenie podczas wywoływania małych modeli połączonych w łańcuch. Ta funkcja dodaje te nowe funkcje:
Przepływ sterowania: NNAPI 1.3 obsługuje ogólny przepływ sterowania dzięki nowym operacjom na grafach
ANEURALNETWORKS_IF
iANEURALNETWORKS_WHILE
, które przyjmują inne modele jako argumenty przy użyciu nowego typu operanduANEURALNETWORKS_MODEL
. Ta funkcja dodaje też te nowe funkcje:
NDK Thermal API
Gdy urządzenia za bardzo się nagrzeją, mogą ograniczyć działanie procesora lub GPU, co może mieć nieoczekiwany wpływ na aplikacje. Aplikacje i gry, które zawierają złożoną grafikę, wymagają intensywnych obliczeń lub ciągłej aktywności sieciowej, są bardziej narażone na problemy.
Używaj interfejsu NDK Thermal API w Androidzie 11, aby monitorować zmiany temperatury na urządzeniu, a następnie podejmować działania mające na celu utrzymanie niższego zużycia energii i niższej temperatury urządzenia. Ten interfejs API jest podobny do Java Thermal API. Możesz go używać do otrzymywania powiadomień o każdej zmianie stanu termicznego lub do bezpośredniego sprawdzania bieżącego stanu.
Tekst i dane wejściowe
Ulepszone przejścia IME
W Androidzie 11 wprowadzono nowe interfejsy API, które usprawniają przejścia w edytorach metod wprowadzania (IME), takich jak klawiatury ekranowe. Te interfejsy API ułatwiają dostosowywanie treści aplikacji w synchronizacji z pojawianiem się i znikaniem edytora IME oraz z innymi elementami, takimi jak pasek stanu i pasek nawigacyjny.
Aby wyświetlić edytor IME, gdy dowolny element EditText
jest aktywny, wywołaj funkcję
view.getInsetsController().show(Type.ime())
.
(Tę metodę możesz wywołać w dowolnym widoku w tej samej hierarchii co widok EditText
, nie musisz wywoływać jej w widoku EditText
). Aby ukryć IME, kliknij view.getInsetsController().hide(Type.ime())
.
Możesz sprawdzić, czy IME jest obecnie widoczny, wywołując metodę view.getRootWindowInsets().isVisible(Type.ime())
.
Aby zsynchronizować widoki aplikacji z pojawianiem się i znikaniem edytora IME, ustaw odbiornik w widoku, podając
WindowInsetsAnimation.Callback
do View.setWindowInsetsAnimationCallback()
.
(Możesz ustawić ten odbiornik w dowolnym widoku, nie musi to być EditText
). Edytor IME wywołuje metodę onPrepare()
odbiornika, a następnie na początku przejścia wywołuje metodę onStart()
. Następnie wywołuje funkcję
onProgress()
przy każdym postępie przejścia. Po zakończeniu przejścia IME wywołuje
onEnd()
.
W dowolnym momencie przejścia możesz sprawdzić jego postęp, wywołując funkcję
WindowInsetsAnimation.getFraction()
.
Przykład użycia tych interfejsów API znajdziesz w nowym przykładzie kodu WindowInsetsAnimation.
Sterowanie animacją IME
Możesz też przejąć kontrolę nad animacją IME lub animacją innego paska systemowego, np. paska nawigacyjnego. Aby to zrobić, najpierw wywołaj
setOnApplyWindowInsetsListener()
w celu ustawienia nowego odbiorcy zmian w przypadku wstawki okna:
Kotlin
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Java
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
Aby przenieść IME lub inny pasek systemowy, wywołaj metodę kontrolera
controlWindowInsetsAnimation()
:
Kotlin
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Java
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
Aktualizacje bibliotek ICU
Android 11 aktualizuje pakiet android.icu
, aby używać wersji 66 biblioteki ICU, w porównaniu z wersją 63 w Androidzie 10. Nowa wersja biblioteki zawiera zaktualizowane dane lokalne CLDR i szereg ulepszeń obsługi internacjonalizacji w Androidzie.
Najważniejsze zmiany w nowych wersjach biblioteki:
- Wiele interfejsów API formatowania obsługuje teraz nowy typ obiektu zwracanego, który rozszerza
FormattedValue
. - Interfejs
LocaleMatcher
API został rozbudowany o klasę konstruktora, obsługę typujava.util.Locale
i klasę wyniku zawierającą dodatkowe dane o dopasowaniu. - Obsługiwany jest teraz standard Unicode 13.
Multimedia
Przydzielanie buforów MediaCodec
Android 11 zawiera nowe interfejsy APIMediaCodec
, które zapewniają aplikacjom większą kontrolę nad przydzielaniem buforów wejściowych i wyjściowych. Dzięki temu aplikacja może wydajniej zarządzać pamięcią.
Nowe zajęcia:
Nowe metody:
MediaCodec.getQueueRequest()
MediaCodec.getOutputFrame()
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
Dodatkowo zmieniło się działanie 2 metod w MediaCodec.Callback()
:
onInputBufferAvailable()
- Zamiast wywoływać funkcje
MediaCodec.getInputBuffer()
iMediaCodec.queueInputBuffer()
z indeksem, jeśli aplikacje są skonfigurowane do korzystania z interfejsu BlockModel API, powinny używać funkcjiMediaCodec.getQueueRequest
z indeksem, dołączając do gniazda element LinearBlock lub HardwareBuffer. onOutputBufferAvailable()
- Zamiast wywoływać
MediaCodec.getOutputBuffer()
z indeksem, aplikacje mogą używaćMediaCodec.getOutputFrame()
z indeksem, aby uzyskać obiektOutputFrame
z większą ilością informacji i buforami LinearBlock/HardwareBuffer.
Dekodowanie z niskim opóźnieniem w MediaCodec
Android 11 został ulepszonyMediaCodec
, aby obsługiwać dekodowanie z niskim opóźnieniem w przypadku gier i innych aplikacji działających w czasie rzeczywistym. Możesz sprawdzić, czy kodek obsługuje dekodowanie z niskim opóźnieniem, przekazując FEATURE_LowLatency
do MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
Aby włączyć lub wyłączyć dekodowanie z niską latencją, wykonaj jedną z tych czynności:
- Ustaw nowy klucz
KEY_LOW_LATENCY
na 0 lub 1, używającMediaCodec.configure()
. - Ustaw nowy klucz parametru
PARAMETER_KEY_LOW_LATENCY
na 0 lub 1, używającMediaCodec.setParameters()
.
Nowa funkcja AAudio AAudioStream_release()
Funkcja
AAudioStream_close()
zwalnia i zamyka strumień audio w tym samym czasie. Może to być niebezpieczne. Jeśli inny proces spróbuje uzyskać dostęp do strumienia po jego zamknięciu, ulegnie awarii.
Nowa funkcja
AAudioStream_release()
zwalnia strumień, ale go nie zamyka. Zwalnia to zasoby i pozostawia strumień w znanym stanie. Obiekt jest przechowywany do momentu wywołania funkcji AAudioStream_close()
.
MediaParser API
MediaParser to nowy interfejs API niskiego poziomu do wyodrębniania multimediów. Jest bardziej elastyczny niż MediaExtractor i zapewnia dodatkową kontrolę nad funkcją wyodrębniania multimediów.
Przechwytywanie dźwięku z urządzenia USB
Gdy aplikacja bez uprawnień RECORD_AUDIO
używa interfejsu UsbManager
, aby poprosić o bezpośredni dostęp do urządzenia audio USB z funkcją rejestrowania dźwięku (np. słuchawek USB), pojawia się nowy komunikat ostrzegawczy z prośbą o potwierdzenie uprawnień do korzystania z urządzenia. System ignoruje opcję „Zawsze używaj”, więc użytkownik musi potwierdzić ostrzeżenie i przyznać uprawnienia za każdym razem, gdy aplikacja poprosi o dostęp.
Aby tego uniknąć, aplikacja powinna prosić o uprawnienie RECORD_AUDIO
.
Jednoczesny dostęp do mikrofonu
W Androidzie 11 dodaliśmy nowe metody do interfejsów API AudioRecord
, MediaRecorder
i AAudioStream
. Te metody włączają i wyłączają możliwość jednoczesnego rejestrowania obrazu niezależnie od wybranego przypadku użycia. Zobacz Udostępnianie wejścia audio.
Przełącznik wyjścia
Android 11 wprowadza nowe działanie w przypadku aplikacji, które korzystają z interfejsów API cast i mediarouter.
Oprócz dostępu do opcji przesyłania w aplikacji opcje przełączania są też widoczne w systemowym odtwarzaczu multimediów. Ułatwia to użytkownikowi płynne przechodzenie między urządzeniami, gdy zmienia kontekst oglądania i słuchania, np. ogląda film w kuchni lub na telefonie albo słucha dźwięku w domu lub w samochodzie. Zobacz przełącznik wyjścia.
Łączność
Ulepszenia Wi-Fi Passpoint
Informacje o funkcjach Passpoint dodanych w Androidzie 11 znajdziesz w artykule Passpoint.
Interfejs Wi-Fi Suggestion API jest rozwinięty.
Android 11 rozszerza interfejs Wi-Fi Suggestion API, aby zwiększyć możliwości zarządzania siecią w aplikacji, w tym:
- Aplikacje do zarządzania łącznością mogą zarządzać własnymi sieciami, zezwalając na żądania odłączenia.
- Sieci Passpoint są zintegrowane z interfejsem Suggestion API i mogą być sugerowane użytkownikowi.
- Interfejsy Analytics API umożliwiają uzyskiwanie informacji o jakości sieci.
Aktualizacje CallScreeningService
Od Androida 11 usługa CallScreeningService może żądać informacji o stanie weryfikacji STIR/SHAKEN (verstat) w przypadku połączeń przychodzących. Te informacje są podawane w ramach szczegółów połączenia w przypadku połączeń przychodzących.
Jeśli aplikacja ma uprawnienie CallScreeningService
READ_CONTACTS
, jest powiadamiana o połączeniach przychodzących z numerów w kontaktach użytkownika i połączeniach wychodzących na te numery.
Więcej informacji znajdziesz w artykule Zapobieganie podszywaniu się pod numer telefonu.
Aktualizacje Open Mobile API
Informacje o obsłudze OMAPI na urządzeniach z Androidem 11 i nowszym znajdziesz w artykule Obsługa czytnika Open Mobile API.
Wydajne sieci VPN
Aplikacje kierowane na interfejs API na poziomie 30 lub wyższym albo działające na urządzeniach wprowadzonych na rynek z interfejsem API na poziomie 29 lub wyższym mogą stosować IKEv2/IPsec w przypadku sieci VPN skonfigurowanych przez użytkownika i sieci VPN opartych na aplikacjach.
Sieci VPN działają natywnie w systemie operacyjnym, co upraszcza kod wymagany do nawiązywania połączeń VPN IKEv2/IPsec w aplikacji.
Kontrola dostępu do sieci na poziomie procesu
Informacje o włączaniu dostępu do sieci w przypadku poszczególnych procesów znajdziesz w artykule Zarządzanie wykorzystaniem sieci.
Zezwalaj na wiele zainstalowanych konfiguracji Passpoint z tym samym w pełni kwalifikowanym adresem domeny
Od Androida 11 możesz używać
PasspointConfiguration.getUniqueId()
do uzyskiwania unikalnego identyfikatora obiektu PasspointConfiguration
, co umożliwia
użytkownikom aplikacji instalowanie wielu profili z tą samą pełną i jednoznaczną nazwą domeny (FQDN).
Ta funkcja jest przydatna, gdy operator wdraża w swojej sieci więcej niż 1 kombinację kodu kraju komórki (MCC) i kodu sieci komórkowej (MNC), ale ma tylko 1 w pełni kwalifikowaną nazwę domeny. Na Androidzie 11 i nowszych można zainstalować więcej niż 1 profil z tym samym w pełni kwalifikowanym adresem domeny, który będzie pasować do sieci jako dostawca domowy, gdy użytkownik zainstaluje kartę SIM z kodem kraju lub kodem sieci komórkowej.
Obsługa anteny GNSS
Android 11 wprowadza klasę
GnssAntennaInfo
, która umożliwia aplikacji lepsze wykorzystanie pozycjonowania z dokładnością do centymetra, jakie może zapewnić globalny system nawigacji satelitarnej (GNSS).
Więcej informacji znajdziesz w przewodniku na temat kalibracji anteny.
Grafika
Dekoder obrazów NDK
Interfejs NDK ImageDecoder
API udostępnia standardowy interfejs API dla aplikacji na Androida w językach C/C++, który umożliwia bezpośrednie dekodowanie obrazów. Deweloperzy aplikacji nie muszą już używać interfejsów API platformy (za pomocą JNI) ani dołączać bibliotek dekodowania obrazów innych firm. Więcej informacji znajdziesz w przewodniku dla programistów dotyczącym dekodera obrazów.
Interfejs Frame rate API
Android 11 udostępnia interfejs API, który umożliwia aplikacjom informowanie systemu o zamierzonej liczbie klatek na sekundę, aby zmniejszyć drgania na urządzeniach obsługujących wiele częstotliwości odświeżania. Informacje o korzystaniu z tego interfejsu API znajdziesz w przewodniku po liczbie klatek na sekundę.
Wysyłanie prośby o obsługę małych opóźnień i sprawdzanie, czy jest ona dostępna
Niektóre wyświetlacze mogą przetwarzać grafikę, np. niektóre zewnętrzne wyświetlacze i telewizory. To przetwarzanie końcowe poprawia grafikę, ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają automatyczny tryb niskiego opóźnienia (ALLM, znany też jako tryb gry), który minimalizuje opóźnienie przez wyłączenie przetwarzania końcowego. Więcej informacji o ALLM znajdziesz w specyfikacji HDMI 2.1.
Okno może poprosić o użycie automatycznego trybu niskiego opóźnienia, jeśli jest on dostępny. ALLM jest szczególnie przydatny w przypadku aplikacji takich jak gry i wideokonferencje, w których niskie opóźnienie jest ważniejsze niż najlepsza możliwa grafika.
Aby włączyć lub wyłączyć minimalne przetwarzanie końcowe, wywołaj
Window.setPreferMinimalPostProcessing()
lub ustaw atrybut okna
preferMinimalPostProcessing
na true
. Nie wszystkie wyświetlacze obsługują minimalne przetwarzanie końcowe. Aby sprawdzić, czy dany wyświetlacz je obsługuje, wywołaj nową metodę Display.isMinimalPostProcessingSupported()
.
Wydajne wstrzykiwanie warstwy debugowania grafiki
Aplikacje mogą teraz wczytywać zewnętrzne warstwy graficzne (GLES, Vulkan) do natywnego kodu aplikacji, aby udostępniać te same funkcje co aplikacja z możliwością debugowania, ale bez obciążenia wydajności. Ta funkcja jest szczególnie ważna podczas profilowania aplikacji za pomocą narzędzi takich jak GAPID. Aby profilować aplikację, w pliku manifestu aplikacji umieść ten element meta-data zamiast ustawiać aplikację jako podlegającą debugowaniu:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Obrazy i aparat
Wyciszanie dźwięków i wibracji powiadomień podczas aktywnego nagrywania
Od Androida 11, gdy aktywnie korzystasz z aparatu, aplikacja może wyciszać tylko wibracje, zarówno dźwięki, jak i wibracje, lub żadne z nich za pomocą interfejsu setCameraAudioRestriction()
.
Rozszerzona obsługa aparatu w emulatorze Androida
Informacje o rozszerzonej obsłudze aparatów w emulatorze od Androida 11 znajdziesz w sekcji Obsługa aparatu.
Obsługa jednoczesnego używania więcej niż 1 kamery
Android 11 dodaje interfejsy API do sprawdzania obsługi używania więcej niż jednego aparatu naraz, w tym przedniego i tylnego.
Aby sprawdzić, czy urządzenie, na którym działa aplikacja, obsługuje tę funkcję, użyj tych metod:
getConcurrentCameraIds()
zwracaSet
kombinacji identyfikatorów kamer, które mogą przesyłać strumienie jednocześnie z gwarantowanymi kombinacjami strumieni, gdy są skonfigurowane przez ten sam proces aplikacji.isConcurrentSessionConfigurationSupported()
sprawdza, czy urządzenia z kamerą mogą jednocześnie obsługiwać odpowiednie konfiguracje sesji.
Lepsza obsługa obrazów HEIF z wieloma ramkami
Od Androida 11, jeśli wywołasz ImageDecoder.decodeDrawable()
i przekażesz obraz HEIF zawierający sekwencję klatek (np. animację lub serię zdjęć), metoda zwróci AnimatedImageDrawable
zawierający całą sekwencję obrazów. W starszych wersjach Androida ta metoda zwracała BitmapDrawable
tylko jednej klatki.
Jeśli grafika HEIF zawiera wiele klatek, które nie są ułożone w sekwencję, możesz pobrać poszczególne klatki, wywołując funkcję MediaMetadataRetriever.getImageAtIndex()
.
Ułatwienia dostępu
Aktualizacje dla deweloperów usług ułatwień dostępu
Jeśli utworzysz niestandardową usługę ułatwień dostępu, możesz korzystać z tych funkcji w Androidzie 11:
- Wyjaśnienie usługi ułatwień dostępu wyświetlane użytkownikowi może teraz zawierać kod HTML i obrazy, a nie tylko zwykły tekst. Dzięki tej elastyczności łatwiej jest wyjaśnić użytkownikom, czym jest Twoja usługa i jak może im pomóc.
- Aby pracować z opisem stanu elementu interfejsu, który ma większe znaczenie semantyczne niż
contentDescription
, wywołaj metodęgetStateDescription()
. - Aby zażądać, aby zdarzenia dotyku omijały eksplorator dotyku systemu, wywołaj
setTouchExplorationPassthroughRegion()
. Podobnie, aby poprosić o pominięcie detektora gestów systemu, wywołaj funkcjęsetGestureDetectionPassthroughRegion()
. - Możesz poprosić o wykonanie działań IME, takich jak „enter” i „dalej”, a także o zrzuty ekranu okien, które nie umożliwiają użycia flagi
FLAG_SECURE
.
Dodatkowe funkcje
Przyczyny zamknięcia procesu aplikacji
W Androidzie 11 wprowadzono metodę
ActivityManager.getHistoricalProcessExitReasons()
, która podaje przyczyny ostatnich zakończeń procesów. Aplikacje mogą używać tej metody do zbierania informacji diagnostycznych o awariach, np. czy zakończenie procesu jest spowodowane błędami ANR, problemami z pamięcią czy innymi przyczynami.
Możesz też użyć nowej metody
setProcessStateSummary()
do przechowywania niestandardowych informacji o stanie na potrzeby późniejszej analizy.
Metoda getHistoricalProcessExitReasons()
zwraca instancje klasy ApplicationExitInfo
, która zawiera informacje o zakończeniu procesu aplikacji. Wywołując metodę
getReason()
w instancji tej klasy, możesz określić, dlaczego proces aplikacji został zakończony. Na przykład wartość zwracana REASON_CRASH
wskazuje, że w aplikacji wystąpił nieobsłużony wyjątek. Jeśli aplikacja musi zapewnić niepowtarzalność zdarzeń wyjścia, może utrzymywać identyfikator specyficzny dla aplikacji, np. wartość skrótu opartą na sygnaturze czasowej z metody getTimestamp()
.
Dodatkowe materiały
Więcej informacji znajdziesz w artykule New Android 11 tools to make apps more private and stable (Nowe narzędzia Androida 11, które zwiększają prywatność i stabilność aplikacji) na platformie Medium.
Ładowanie zasobów
Android 11 wprowadza nowy interfejs API, który umożliwia aplikacjom dynamiczne rozszerzanie sposobu wyszukiwania i wczytywania zasobów. Nowe klasy interfejsu API ResourcesLoader
i ResourcesProvider
odpowiadają głównie za udostępnianie nowych funkcji. Umożliwiają one dostarczanie dodatkowych zasobów i komponentów lub modyfikowanie wartości istniejących zasobów i komponentów.
ResourcesLoader
to kontenery, które dostarczają obiekty ResourcesProvider
do instancji Resources
aplikacji. Z kolei obiekty ResourcesProvider
udostępniają metody wczytywania danych zasobów z plików APK i tabel zasobów.
Jednym z głównych zastosowań tego interfejsu API jest niestandardowe wczytywanie komponentów. Możesz użyć
loadFromDirectory()
do utworzenia ResourcesProvider
, który przekierowuje rozpoznawanie zasobów i komponentów opartych na plikach, powodując wyszukiwanie w określonym katalogu zamiast w pliku APK aplikacji. Dostęp do tych zasobów możesz uzyskać za pomocą rodziny metod open()
z klasy interfejsu API AssetManager
, tak jak w przypadku zasobów dołączonych do pliku APK.
Schemat podpisu plików APK w wersji 4
Android 11 obsługuje schemat podpisywania plików APK w wersji 4. Ten schemat
tworzy nowy rodzaj podpisu w osobnym pliku (apk-name.apk.idsig
), ale
jest podobny do wersji 2 i 3. Nie wprowadzamy żadnych zmian w pliku APK. Ten schemat obsługuje przyrostową instalację pakietu APK za pomocą ADB, co przyspiesza instalację pakietu APK.
Dynamiczne filtry intencji
Aby aplikacja mogła odbierać intencje, musi w momencie kompilacji zadeklarować, jakie typy danych może odbierać, definiując filtr intencji w pliku manifestu aplikacji. W Androidzie 10 i starszych wersjach aplikacje nie mogą zmieniać filtrów intencji w czasie działania. Jest to problem w przypadku aplikacji do wirtualizacji (takich jak maszyny wirtualne i zdalne pulpity), ponieważ nie mają one możliwości dokładnego określenia, jakie oprogramowanie użytkownik zainstaluje w ich wnętrzu.
Android 11 wprowadza grupy MIME, czyli nowy element manifestu, który umożliwia aplikacji deklarowanie dynamicznego zestawu typów MIME w filtrze intencji i modyfikowanie go programowo w czasie działania. Aby użyć grupy MIME, w pliku manifestu aplikacji umieść element danych z nowym atrybutem android:mimeGroup
:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
Wartość atrybutu android:mimeGroup
to dowolny ciąg znaków, który identyfikuje grupę MIME w czasie działania. Możesz uzyskać dostęp do zawartości grupy MIME i ją aktualizować, przekazując jej identyfikator do tych nowych metod w klasie interfejsu API PackageManager
:
Gdy dodasz typ MIME do grupy MIME programowo, będzie on działać dokładnie tak samo jak statyczny typ MIME zadeklarowany w pliku manifestu.
bez wzajemnego zakłócania działania.Ulepszenia autouzupełniania
Android 11 wprowadza ulepszenia usług autouzupełniania.
Identyfikatory wskazówek w klasie AssistStructure.ViewNode
Usługi autouzupełniania często obliczają hash podpisu widoku na podstawie jego właściwości. Wskazówka dotycząca widoku to szczególnie przydatna właściwość do uwzględnienia podczas obliczania skrótu podpisu, ale ciąg wskazówki może się zmieniać w zależności od ustawień regionalnych telefonu. Aby rozwiązać ten problem, Android 11 rozszerza AssistStructure.ViewNode
o nową metodę getHintIdEntry()
, która zwraca identyfikator zasobu tekstu podpowiedzi widoku. Ta metoda zwraca wartość niezależną od ustawień regionalnych, której możesz użyć do obliczenia skrótów podpisu.
Zdarzenia wyświetlania zbiorów danych
Aby pomóc usługom autouzupełniania w ulepszaniu sugestii, Android 11 umożliwia identyfikowanie przypadków, w których usługa autouzupełniania wyświetliła zbiory danych, ale użytkownik nie wybrał żadnego z nich. W Androidzie 11
FillEventHistory
zgłasza nowy
TYPE_DATASETS_SHOWN
typ zdarzenia. FillEventHistory
rejestruje zdarzenie tego typu za każdym razem, gdy usługa autouzupełniania
prezentuje użytkownikowi co najmniej 1 zestaw danych. Usługi autouzupełniania mogą używać tych zdarzeń w połączeniu z dotychczasowym zdarzeniem TYPE_DATASET_SELECTED
, aby określić, czy użytkownik wybrał którąś z udostępnionych opcji autouzupełniania.
Integracja z edytorem IME
Klawiatury i inne edytory IME mogą teraz wyświetlać sugestie autouzupełniania w linii, na pasku sugestii lub w podobnym interfejsie, a nie w menu. Aby chronić informacje poufne, takie jak hasła i numery kart kredytowych, sugestie są wyświetlane użytkownikowi, ale nie są znane IME, dopóki użytkownik nie wybierze jednej z nich. Informacje o tym, jak edytory IME i menedżery haseł mogą obsługiwać tę funkcję, znajdziesz w artykule Integracja autouzupełniania z klawiaturami.
Udostępnianie danych usłudze przechwytywania treści
Od Androida 11 aplikacja może udostępniać dane usłudze przechwytywania treści na urządzeniu. Dzięki temu urządzenie może łatwiej dostarczać informacje kontekstowe, np. wyświetlać nazwę utworu, który jest aktualnie odtwarzany w otoczeniu użytkownika.
Aby udostępnić dane z aplikacji usłudze przechwytywania treści, wywołaj metodę
shareData()
na instancji ContentCaptureManager
. Jeśli system zaakceptuje prośbę o udostępnianie danych, aplikacja otrzyma deskryptor pliku tylko do zapisu, który może udostępnić usłudze przechwytywania treści.