Android 11 wprowadza nowe funkcje i interfejsy API dla deweloperów. W sekcjach poniżej znajdziesz informacje o funkcjach aplikacji i powiązanych z nimi interfejsach API.
Szczegółową listę nowych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie porównawczym interfejsów API. Szczegółowe informacje o nowych interfejsach API znajdziesz w dokumentacji interfejsu API Androida – nowe interfejsy API są wyróżnione. Aby dowiedzieć się więcej o obszarach, w których zmiany w 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 w zakresie prywatności.
Nowe funkcje
Sterowanie urządzeniami
Android 11 zawiera nowy interfejs API ControlsProviderService
, którego możesz używać do udostępniania elementów sterujących dla podłączonych urządzeń zewnętrznych. Te opcje są widoczne w sekcji Ustawienia urządzenia w menu zasilania Androida. 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 są widoczne w pobliżu szybkich ustawień. Sesje z wielu aplikacji są uporządkowane w karuzeli, którą można przewijać. Obejmuje ona strumienie odtwarzane lokalnie na telefonie, strumienie zdalne, takie jak te wykryte na urządzeniach zewnętrznych lub sesje przesyłania, a także poprzednie sesje, które można wznowić, w kolejności ich ostatniego odtwarzania.
Użytkownicy mogą ponownie uruchomić poprzednie sesje z karuzeli bez konieczności uruchamiania aplikacji. Po rozpoczęciu odtwarzania użytkownik może sterować odtwarzaniem w zwykły sposób.
Więcej informacji znajdziesz w artykule o elementach sterujących multimediami.
Ekrany
Lepsza obsługa wyświetlania kaskad
Android 11 udostępnia kilka interfejsów API do obsługi wyświetlaczy kaskadowych, czyli wyświetlaczy, które otaczają krawędź urządzenia. Takie wyświetlacze są traktowane jako wariant wyświetlaczy z wycięciami. Dotychczasowe metody DisplayCutout
.getSafeInset…()
zwracają teraz bezpieczny wkład, aby uniknąć obszarów kaskadowych i wycięć.
Aby wyrenderować treści aplikacji w obszarze osi czasu:
Aby uzyskać dokładne wymiary wstawki kaskady, zadzwoń pod numer
DisplayCutout.getWaterfallInsets()
.Ustaw atrybut układu okna
layoutInDisplayCutoutMode
naLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
, aby okno rozszerzało się na obszar wycięcia i kaskady na wszystkich krawędziach ekranu. Upewnij się, że w strefach wycinania lub kaskady nie ma żadnych istotnych treści.
Czujnik kąta zawiasów i urządzenia składane
Android 11 umożliwia aplikacjom działającym na urządzeniach z konfiguracjami ekranu opartymi na zawiasach określanie kąta zawiasu za pomocą nowego czujnika z TYPE_HINGE_ANGLE
i nowego SensorEvent
, który może monitorować kąt zawiasu i podawać pomiar w stopniach między dwoma integralnymi częściami urządzenia. Możesz używać tych surowych pomiarów do wykonywania szczegółowych animacji podczas manipulowania urządzeniem przez użytkownika.
Rozmowy
Ulepszenia rozmów
Android 11 wprowadza wiele ulepszeń dotyczących obsługi rozmów. Rozmowy to dwukierunkowa komunikacja w czasie rzeczywistym między co najmniej 2 osobami. Te rozmowy są 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łatwiać wyświetlanie rozmów w całym systemie. W Androidzie 10 bańki były funkcją eksperymentalną, którą można było włączyć w opcjach dla programistów. W Androidzie 11 nie jest to już konieczne.
Jeśli aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, jej powiadomienia nie są wyświetlane jako bąbelki, chyba że spełniają nowe wymagania dotyczące rozmów. W szczególności powiadomienie musi być powiązane z skrótem.
Przed Androidem 11, jeśli chciałeś wyświetlić powiadomienie w bańce, musiałeś wyraźnie określić, że powiadomienie 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 bąbelka, platforma automatycznie skonfiguruje powiadomienie tak, aby zawsze uruchamiać je w trybie interfejsu dokumentu.
Wprowadziliśmy kilka ulepszeń dotyczących wydajności bąbelków, a użytkownicy mają większą swobodę w włączaniu i wyłączaniu bąbelków w poszczególnych aplikacjach. W Androidzie 11 wprowadzono kilka zmian w interfejsach API, które mogą być przydatne deweloperom, którzy wdrożą obsługę eksperymentalną:
- Konstruktor
BubbleMetadata.Builder()
bez parametrów został wycofany. Zamiast tego użyj jednej z 2 nowych metod konstruktora:BubbleMetadata.Builder(PendingIntent, Icon)
lubBubbleMetadata.Builder(String)
. - Utwórz
BubbleMetadata
na podstawie identyfikatora skrótu, wywołując funkcjęBubbleMetadata.Builder(String)
. Przekazany ciąg znaków powinien być zgodny z identyfikatorem skrótu podanym wNotification.Builder
. - Utwórz ikony bąbelków za pomocą funkcji
Icon.createWithContentUri()
lub nowej metodycreateWithAdaptiveBitmapContentUri()
.
Wskaźniki wizualne 5G
Informacje o wyświetlaniu wskaźników 5G na urządzeniach użytkowników znajdziesz w artykule Poinformowanie użytkowników o tym, że korzystają z 5G.
Prywatność
Android 11 wprowadza wiele zmian i ograniczeń, które mają na celu zwiększenie prywatności użytkowników. Więcej informacji znajdziesz na stronie Prywatność.
Bezpieczeństwo
Aktualizacje uwierzytelniania biometrycznego
Aby pomóc Ci kontrolować poziom zabezpieczeń danych aplikacji, Android 11 wprowadza kilka ulepszeń uwierzytelniania biometrycznego. Te zmiany pojawią się też w bibliotece Jetpack Biometric.
Typy uwierzytelniania
Android 11 wprowadza interfejs BiometricManager.Authenticators
, za pomocą którego możesz deklarować typy uwierzytelniania obsługiwane przez Twoją aplikację.
Określanie typu uwierzytelniania
Po uwierzytelnieniu użytkownika możesz sprawdzić, czy uwierzytelnił się za pomocą danych logowania na urządzeniu lub danych biometrycznych, wywołując funkcję getAuthenticationType()
.
Dodatkowa obsługa kluczy uwierzytelniania na potrzeby poszczególnych zastosowań
Android 11 zapewnia większą obsługę uwierzytelniania za pomocą kluczy jednorazowych.
Wycofane metody
W Androidzie 11 wycofane zostały te metody:
- Metoda
setDeviceCredentialAllowed()
. - Metoda
setUserAuthenticationValidityDurationSeconds()
. - Przeciążona wersja funkcji
canAuthenticate()
, która nie przyjmuje żadnych argumentów.
Bezpieczne udostępnianie dużych zbiorów danych
W niektórych sytuacjach, np. gdy korzystasz z systemów uczących się lub odtwarzania multimediów, Twoja aplikacja może chcieć używać tego samego dużego zbioru danych co inna aplikacja. W poprzednich wersjach Androida Twoja aplikacja i inna aplikacja musiały pobierać osobne kopie tego samego zbioru danych.
Aby zmniejszyć redundancję danych, zarówno w sieci, jak i na dysku, Android 11 umożliwia przechowywanie w pamięci podręcznej dużych zbiorów danych za pomocą elementów danych współdzielonych. Więcej informacji o udostępnianiu zbiorów danych znajdziesz w szczegółowym przewodniku na temat udostępniania dużych zbiorów danych.
Wykonywanie szyfrowania opartego na plikach po ponownym uruchomieniu OTA bez danych logowania użytkownika
Po zakończeniu aktualizacji OTA i ponownym uruchomieniu urządzenia klucze szyfrowania danych logowania (CE) umieszczone w miejscu pamięci chronionym przez dane logowania są natychmiast dostępne do operacji szyfrowania opartego na plikach (FBE). Oznacza to, że po aktualizacji OTA Twoja aplikacja może wznowić działanie, które wymaga kluczy CE, zanim użytkownik wpisze kod PIN, wzór lub hasło.
Skuteczność i jakość
Debugowanie bezprzewodowe
Android 11 obsługuje bezprzewodowe wdrażanie i debugowanie aplikacji z stanowiska roboczego za pomocą Android Debug Bridge (adb). Możesz na przykład wdrożyć aplikację do 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 dużych plików APK (powyżej 2 GB) na urządzeniu może zająć dużo czasu, nawet jeśli w aplikacji wprowadzono tylko niewielką zmianę. Instalacja przyrostowa pliku APK za pomocą ADB (Android Debug Bridge) przyspiesza ten proces, instalując wystarczającą ilość pliku APK, aby można było uruchomić aplikację, a pozostałe dane są przesyłane strumieniowo w tle. adb install
automatycznie użyje tej funkcji, jeśli jest ona obsługiwana przez urządzenie i masz zainstalowaną najnowszą wersję pakietu SDK Platform-Tools. Jeśli nie jest obsługiwana, używana jest domyślna metoda instalacji.
Aby korzystać z tej funkcji, użyj tego polecenia adb. Jeśli urządzenie nie obsługuje instalacji przyrostowej, polecenie kończy się niepowodzeniem i wyświetla obszerne wyjaśnienie.
adb install --incremental
Przed uruchomieniem ADB do stopniowego instalowania plików APK musisz podpisać plik APK i utworzyć plik z schematem 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 sterownika pamięci;
GWP-ASan to funkcja natywnej alokacji pamięci, która pomaga znaleźć błędy związane z odwołaniem do pamięci po jej zwolnieniu (use-after-free) i przepełnieniami bufora na stercie (heap-buffer-overflow). Możesz włączyć tę funkcję globalnie lub w przypadku określonych podprocesów aplikacji. Więcej informacji znajdziesz w przewodniku GWP-Asan.
Neural Networks API 1.3
Android 11 rozszerza i ulepsza interfejs API sieci neuronowych (NNAPI).
Nowe operacje
NNAPI 1.3 wprowadza nowy typ operandu, TENSOR_QUANT8_ASYMM_SIGNED
, aby obsługiwać nowy schemat kwantyzacji TensorFlow Lite.
Dodatkowo w NNAPI 1.3 wprowadzono te nowe operacje:
QUANTIZED_LSTM
IF
WHILE
ELU
HARD_SWISH
FILL
RANK
Nowe opcje sterowania systemami uczących się
NNAPI 1.3 wprowadza nowe ustawienia, które ułatwiają prawidłowe działanie systemów uczących się:
Interfejs QoS API: nowy interfejs Quality of Service API obsługuje priorytety i terminy zadań w NNAPI za pomocą tych nowych funkcji:
Wejście/wyjście z domeny pamięci: NNAPI 1.3 obsługuje domeny pamięci jako dane wejściowe i wyjściowe. Pozwala to usunąć niepotrzebne kopie tych samych danych w różnych komponentach systemu, co zwiększa wydajność sieci neuronowych Androida. Ta funkcja dodaje zestaw nowych interfejsów NDK do wykorzystania w przypadku obiektów
ANeuralNetworksMemoryDesc
iANeuralNetworkMemory
, w tym tych funkcji:ANeuralNetworksMemoryDesc_create()
ANeuralNetworksMemoryDesc_free()
ANeuralNetworksMemoryDesc_addInputRole()
ANeuralNetworksMemoryDesc_addOutputRole()
ANeuralNetworksMemoryDesc_setDimensions()
ANeuralNetworksMemoryDesc_finish()
ANeuralNetworksMemory_createFromDesc()
ANeuralNetworksMemory_copy()
Więcej informacji znajdziesz w przykładowym modelu sieci neuronowej z pamięcią.
Obsługa interfejsu API zależności i ogrodzeń synchronizacji: NNAPI 1.3 obsługuje asynchroniczne przetwarzanie z zależnościami, co pozwala znacznie zmniejszyć nakład pracy przy wywoływaniu małych połączonych modeli. Ta funkcja dodaje te nowe funkcje:
Przepływ sterowania: NNAPI 1.3 obsługuje ogólny przepływ sterowania za pomocą nowych operacji na grafie
ANEURALNETWORKS_IF
iANEURALNETWORKS_WHILE
, które przyjmują inne modele jako argumenty za pomocą nowego typu operandaANEURALNETWORKS_MODEL
. Dodatkowo ta funkcja umożliwia wykonywanie tych nowych działań:
NDK Thermal API
Gdy urządzenia się przegrzeją, mogą ograniczyć działanie procesora lub karty graficznej, co może mieć nieoczekiwany wpływ na działanie aplikacji. Aplikacje lub gry, które zawierają skomplikowaną grafikę, wymagają dużych zasobów obliczeniowych lub utrzymują aktywność sieci, są bardziej podatne na problemy.
Używaj interfejsu NDK Thermal API w Androidzie 11, aby monitorować zmiany temperatury na urządzeniu, a potem podejmować działania w celu zmniejszenia zużycia energii i obniżenia temperatury urządzenia. Ten interfejs API jest podobny do interfejsu Java Thermal API. Możesz go używać, aby otrzymywać powiadomienia o każdej zmianie stanu termicznego lub bezpośrednio sprawdzać bieżący stan.
Tekst i dane wejściowe
Ulepszone przejścia między IME
Android 11 wprowadza nowe interfejsy API, które ułatwiają przejścia między edytorami metod wprowadzania (IME), takimi jak klawiatury ekranowe. Te interfejsy API ułatwiają dostosowywanie treści aplikacji w zsynchronizowany sposób z występowaniem i znikaniem IME oraz innymi elementami, takimi jak pasek stanu i pasek nawigacyjny.
Aby wyświetlić IME, gdy fokus jest ustawiony na dowolnym elemencie EditText
, wywołaj funkcję view.getInsetsController().show(Type.ime())
.
(metodę tę można wywołać w dowolnym widoku w tej samej hierarchii co skupiony EditText
, nie trzeba jej wywoływać w szczególnie EditText
). Aby ukryć IME, wywołaj metodę view.getInsetsController().hide(Type.ime())
.
Aby sprawdzić, czy IME jest obecnie widoczne, zadzwoń pod numer view.getRootWindowInsets().isVisible(Type.ime())
.
Aby zsynchronizować widoki aplikacji z występowaniem i znikaniem klawiatury IME, ustaw listenera na widoku, podając parametr WindowInsetsAnimation.Callback
do View.setWindowInsetsAnimationCallback()
.
(Możesz ustawić tego słuchacza w dowolnym widoku, nie musi to być widok EditText
). IME wywołuje metodę onPrepare()
słuchacza, a następnie wywołuje onStart()
na początku przejścia. Następnie wywołuje funkcję onProgress()
na każdym etapie przejścia. Po zakończeniu przejścia IME wywołuje funkcję onEnd()
.
W dowolnym momencie przejścia możesz sprawdzić, jak daleko zaawansowało, wywołując funkcję WindowInsetsAnimation.getFraction()
.
Przykład użycia tych interfejsów API znajdziesz w nowym przykładowym kodzie 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 funkcję setOnApplyWindowInsetsListener()
, aby ustawić nowego słuchacza zmian w ramce 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 systemu, wywołaj metodę controlWindowInsetsAnimation()
sterownika:
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, która zastępuje wersję 63 w Androidzie 10. Nowa wersja biblioteki zawiera zaktualizowane dane dotyczące lokalizacji CLDR oraz kilka ulepszeń obsługi międzynarodowej w Androidzie.
Ważniejsze zmiany w nowych wersjach biblioteki:
- Wiele interfejsów API do formatowania obsługuje teraz nowy typ zwracanego obiektu, który rozszerza
FormattedValue
. - Interfejs API
LocaleMatcher
został rozszerzony o klasę konstruktora, obsługę typujava.util.Locale
oraz klasę wyników z dodatkowymi informacjami o znalezieniu dopasowania. - Obsługiwana jest teraz wersja Unicode 13.
Multimedia
Przydzielanie buforów MediaCodec
Android 11 zawiera nowe interfejsy API MediaCodec
, które zapewniają aplikacjom większą kontrolę nad przydzielaniem buforów wejściowych i wyjściowych. Dzięki temu aplikacja może efektywniej zarządzać pamięcią.
Nowe zajęcia:
Nowe metody:
MediaCodec.getQueueRequest()
MediaCodec.getOutputFrame()
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
Ponadto zmieniliśmy działanie 2 metod w bibliotece MediaCodec.Callback()
:
onInputBufferAvailable()
- Zamiast wywoływać
MediaCodec.getInputBuffer()
iMediaCodec.queueInputBuffer()
z indeksem, jeśli aplikacja jest skonfigurowana do używania interfejsu BlockModel API, powinna używać funkcjiMediaCodec.getQueueRequest
z indeksem, dołączając do slotu blok liniowy lub bufor sprzętowy. onOutputBufferAvailable()
- Zamiast wywoływać funkcję
MediaCodec.getOutputBuffer()
z indeksem, aplikacje mogą używać funkcjiMediaCodec.getOutputFrame()
z indeksem, aby uzyskać obiektOutputFrame
z dodatkowymi informacjami i buforami LinearBlock/HardwareBuffer.
Dekodowanie o małym opóźnieniu w MediaCodec
Android 11 MediaCodec
obsługuje dekodowanie z niską latencją w przypadku gier i innych aplikacji działających w czasie rzeczywistym. Aby sprawdzić, czy kodek obsługuje dekodowanie z niską latencją, prześlij 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 za pomocą opcjiMediaCodec.configure()
. - Ustaw nowy klucz parametru
PARAMETER_KEY_LOW_LATENCY
na 0 lub 1, używając do tego parametruMediaCodec.setParameters()
.
Nowa funkcja AAudio AAudioStream_release()
Funkcja
AAudioStream_close()
wypuszcza 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, proces ulegnie awarii.
Nowa funkcja AAudioStream_release()
zwalni strumień, ale go nie zamyka. Pozwala to zwolnić zasoby i utrzymać strumień w znanym stanie. Obiekt będzie przechowywany do momentu wywołania funkcji AAudioStream_close()
.
Interfejs MediaParser API
MediaParser to nowy interfejs API na niskim poziomie do wyodrębniania multimediów. Jest on bardziej elastyczny niż MediaExtractor i zapewnia dodatkową kontrolę nad funkcjami wyodrębniania multimediów.
Nagrywanie dźwięku z urządzenia USB
Gdy aplikacja bez uprawnień RECORD_AUDIO
używa interfejsu UsbManager
, aby poprosić o bezpośrednie użycie urządzenia audio USB z możliwością rejestrowania dźwięku (np. słuchawek USB), pojawia się nowe ostrzeżenie z prośbą o potwierdzenie uprawnień do korzystania z urządzenia. System ignoruje opcję „Zawsze zezwalaj”, więc użytkownik musi zaakceptować ostrzeżenie i wyrazić zgodę na dostęp za każdym razem, gdy aplikacja go poprosi.
Aby uniknąć tego zachowania, aplikacja powinna poprosić o uprawnienie RECORD_AUDIO
.
Równoczesny dostęp do mikrofonu
Android 11 dodaje nowe metody do interfejsów API AudioRecord
, MediaRecorder
i AAudioStream
. Te metody umożliwiają jednoczesne włączanie i wyłączanie możliwości rejestrowania niezależnie od wybranego przypadku użycia. Zobacz Udostępnianie wejścia audio.
Przełącznik wyjścia
Android 11 wprowadza nowe działanie dla aplikacji, które korzystają z interfejsów cast i mediarouter.
Oprócz opcji przesyłania danych z aplikacji opcje przełączania są też widoczne w systemowym odtwarzaczu multimediów. Dzięki temu użytkownik może płynnie przełączać się 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.
Rozszerzenie interfejsu API sugestii dotyczących sieci Wi-Fi
Android 11 rozszerza interfejs API sugestii Wi-Fi, aby zwiększyć możliwości zarządzania siecią w aplikacji. Dotyczy to m.in. tych funkcji:
- Aplikacje do zarządzania łącznością mogą zarządzać własnymi sieciami, zezwalając na prośby o rozłączenie.
- Sieci Passpoint są zintegrowane z interfejsem Suggestion API i mogą być sugerowane użytkownikowi.
- Interfejsy API Analytics umożliwiają uzyskanie informacji o jakości sieci.
Aktualizacje CallScreeningService
Począwszy od Androida 11 usługa CallScreeningService może prosić o informacje 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 CallScreeningService
ma uprawnienie READ_CONTACTS
, aplikacja jest powiadamiana o przychodzących lub wychodzących połączeniach z numeru z listy kontaktów użytkownika.
Więcej informacji znajdziesz w artykule Zapobieganie podszywania numeru dzwoniącego.
Aktualizacje interfejsu Open Mobile API
Informacje o obsługiwaniu OMAPI w Androidzie 11 i nowszych znajdziesz w artykule Obsługa czytnika w Open Mobile API.
wydajne sieci VPN,
Aplikacje kierowane na interfejs API na poziomie 30 lub wyższym lub działające na urządzeniach z poziomem interfejsu API 29 lub wyższym mogą stosować IKEv2/IPsec do VPN-ów zarówno konfigurowanych przez użytkownika, jak i bazujących 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 dla poszczególnych procesów znajdziesz w artykule Zarządzanie korzystaniem z sieci.
Zezwalanie na wiele zainstalowanych konfiguracji Passpoint z tym samym FQDN
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órkowego (MCC) i kodu sieci komórkowej (MNC), ale ma tylko 1 adres FQDN. W Androidzie 11 i nowszych można zainstalować więcej niż 1 profil z tym samym FQDN, który będzie pasować do sieci jako dostawca usługi domowej, gdy użytkownik zainstaluje kartę SIM z MCC lub MNC.
Obsługa anteny GNSS
Android 11 wprowadza klasę GnssAntennaInfo
, która umożliwia aplikacji lepsze wykorzystanie pozycjonowania z dokładnością do centymetra, które zapewnia globalny system nawigacji satelitarnej (GNSS).
Więcej informacji znajdziesz w przewodniku na temat kalibrowania anteny.
Grafika
Dekoder obrazu NDK
Interfejs API NDK ImageDecoder
udostępnia standardowy interfejs API dla aplikacji na Androida napisanych w C/C++, który umożliwia bezpośrednie dekodowanie obrazów. Deweloperzy aplikacji nie muszą już używać interfejsów API frameworku (za pomocą JNI) ani dołączać bibliotek dekodowania obrazu innych firm. Więcej informacji znajdziesz w przewodniku dla programistów dotyczącym dekodera obrazu.
Interfejs API Liczba klatek
Android 11 udostępnia interfejs API, który umożliwia aplikacjom informowanie systemu o pożądanej liczbie klatek na sekundę w celu zmniejszenia zacięcia na urządzeniach obsługujących różne częstotliwości odświeżania. Informacje o korzystaniu z tego interfejsu API znajdziesz w przewodniku po częstotliwości klatek.
Prośba o pomoc dotyczącą niskiego opóźnienia i sprawdzanie, czy jest ona dostępna
Niektóre wyświetlacze, takie jak niektóre zewnętrzne wyświetlacze i telewizory, mogą wykonywać postprocessing grafiki. To przetwarzanie w postprodukcji poprawia jakość grafiki, 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 tego przetwarzania końcowego. Więcej informacji o ALLM znajdziesz w specyfikacji HDMI 2.1.
Okno może poprosić o automatyczne użycie trybu niskiego opóźnienia, jeśli jest on dostępny. ALLM jest szczególnie przydatne w przypadku aplikacji takich jak gry czy wideokonferencje, w których niskie opóźnienie jest ważniejsze niż jakość grafiki.
Aby włączyć lub wyłączyć minimalne przetwarzanie po wykonaniu, wywołaj funkcję Window.setPreferMinimalPostProcessing()
lub ustaw atrybut okna preferMinimalPostProcessing
na true
. Nie wszystkie wyświetlacze obsługują minimalne przetwarzanie w postaci postprocessingu. Aby sprawdzić, czy dany wyświetlacz obsługuje tę funkcję, wywołaj nową metodę Display.isMinimalPostProcessingSupported()
.
Wydajny mechanizm wstrzykiwania 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 debugowaniem, ale bez obciążenia wydajności. Ta funkcja jest szczególnie ważna podczas profilowania aplikacji za pomocą narzędzi takich jak GAPID. Aby przeprowadzić profilowanie aplikacji, zamiast udostępniać aplikację do debugowania, dodaj do pliku manifestu aplikacji ten element metadanych:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Obrazy i kamera
Wyciszanie dźwięków i wibracji powiadomień podczas aktywnego nagrywania
Począwszy od Androida 11, gdy aktywnie korzystasz z aparatu, aplikacja może wyciszyć tylko wibracje, dźwięki i wibracje lub żadne z tych elementów za pomocą setCameraAudioRestriction()
.
Rozszerzona obsługa aparatu w emulatorze Androida
Informacje o rozszerzonej obsłudze aparatów w emulatorze od Androida 11 znajdziesz w artykule Obsługa aparatów.
Obsługa jednoczesnego korzystania z więcej niż 1 kamery
Android 11 dodaje interfejsy API do obsługi zapytań dotyczących korzystania z więcej niż 1 aparatu naraz, w tym z przedniego i tylnego aparatu.
Aby sprawdzić, czy na urządzeniu, na którym działa Twoja aplikacja, jest dostępna obsługa, użyj jednej z tych metod:
getConcurrentCameraIds()
zwracaSet
kombinacji identyfikatorów kamer, które mogą przesyłać strumienie jednocześnie, z gwarantowanymi kombinacjami strumieni skonfigurowanych przez ten sam proces aplikacji.isConcurrentSessionConfigurationSupported()
zapytania, czy urządzenia z kamerą mogą jednocześnie obsługiwać odpowiednie konfiguracje sesji.
Ulepszona obsługa obrazów HEIF z wieloma klatkami
Począwszy od Androida 11, jeśli wywołasz metodę ImageDecoder.decodeDrawable()
i przekazujesz obraz HEIF zawierający sekwencję klatek (np. animację lub serię zdjęć), metoda zwraca obiekt AnimatedImageDrawable
zawierający całą sekwencję obrazów. We wcześniejszych wersjach Androida metoda zwracała BitmapDrawable
tylko jednej klatki.
Jeśli grafika HEIF zawiera wiele klatek, które nie są ułożone w sekwencji, możesz pobrać pojedynczą klatkę, 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:
- Oprócz zwykłego tekstu w objaśnieniach dotyczących usługi ułatwień dostępu można teraz używać języka HTML oraz obrazów. Ta elastyczność ułatwia użytkownikom zrozumienie, czym jest Twoja usługa i jak może im pomóc.
- Aby pracować z opisem stanu elementu interfejsu użytkownika, który jest bardziej znaczący semantycznie niż
contentDescription
, wywołaj metodęgetStateDescription()
. - Aby żądać, aby zdarzenia dotyku omijały systemowy eksplorator dotyku, wywołaj funkcję
setTouchExplorationPassthroughRegion()
. Aby gesty pomijały systemowy moduł wykrywania gestów, wywołaj funkcjęsetGestureDetectionPassthroughRegion()
. - Możesz poprosić o wykonanie czynności IME, takich jak „Enter” i „Dalej”, a także o zrzuty ekranu okien, w których nie włączono flagi
FLAG_SECURE
.
Dodatkowe funkcje
Przyczyny zakończenia procesu aplikacji
Android 11 wprowadza metodę ActivityManager.getHistoricalProcessExitReasons()
, która podaje przyczyny ostatnich zamykania procesów. Aplikacje mogą używać tej metody do zbierania informacji diagnostycznych o awariach, np. czy zakończenie procesu nastąpiło z powodu błędów ANR, problemów z pamięcią lub z innych przyczyn.
Dodatkowo możesz użyć nowej metody setProcessStateSummary()
do przechowywania informacji o stanie niestandardowym na potrzeby późniejszej analizy.
Metoda getHistoricalProcessExitReasons()
zwraca instancje klasy ApplicationExitInfo
, która zawiera informacje związane z zakończeniem procesu aplikacji. Wywołanie funkcji getReason()
w instancji tej klasy pozwala określić, dlaczego proces aplikacji został przerwany. Na przykład wartość zwracana REASON_CRASH
wskazuje, że w aplikacji wystąpił nieobsługiwany wyjątek. Jeśli aplikacja musi zapewnić unikalność zdarzeń wyjścia, może zachować identyfikator specyficzny dla aplikacji, np. wartość funkcji haszującej na podstawie sygnatury czasowej z metody getTimestamp()
.
Dodatkowe materiały
Więcej informacji znajdziesz w artykule na Medium o nowych narzędziach w Androidzie 11, które zwiększają prywatność i stabilność aplikacji.
Ładowarki 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 nowe funkcje. Razem umożliwiają dostarczanie dodatkowych zasobów i komponentów lub modyfikowanie wartości dotychczasowych zasobów i komponentów.
Obiekty ResourcesLoader
to kontenery, które dostarczają obiekty ResourcesProvider
do instancji aplikacji Resources
. Obiekty ResourcesProvider
udostępniają metody ładowania danych zasobów z plików APK i tabel zasobów.
Jednym z głównych zastosowań tego interfejsu API jest wczytywanie niestandardowych zasobów. Możesz użyć loadFromDirectory()
, aby utworzyć ResourcesProvider
, który przekierowuje rozdzielczość zasobów i komponentów opartych na plikach, powodując, że będzie ono wyszukiwać określony katalog, a nie plik APK aplikacji. Do tych zasobów możesz uzyskać dostęp za pomocą rodziny metod open()
z klasy interfejsu API AssetManager
, tak jak w przypadku zasobów zawartych w pliku APK.
Schemat podpisu plików APK w wersji 4
Android 11 obsługuje schemat podpisywania plików APK w wersji 4. Ten schemat generuje nowy rodzaj podpisu w osobnym pliku (apk-name.apk.idsig
), ale poza tym jest podobny do wersji 2 i 3. Plik APK nie ulega zmianie. Ten schemat obsługuje instalację przyrostową pliku APK za pomocą ADB, która przyspiesza instalację pliku APK.
Filtry dynamiczne intencji
Aby odbierać intencje, aplikacja musi podczas kompilacji zadeklarować, jakie typy danych może odbierać. W tym celu musi zdefiniować filtr intencji w pliku manifestu aplikacji. W Androidzie 10 i starszych aplikacje nie mają możliwości zmiany filtrów intencji w czasie działania. Jest to problem w przypadku aplikacji do wirtualizacji (takich jak maszyny wirtualne i stacjonarne pulpity zdalne), ponieważ nie mają one możliwości dowiedzenia się, jakie dokładnie oprogramowanie użytkownik zainstaluje.
Android 11 wprowadza grupy MIME, czyli nowy element pliku manifestu, który umożliwia aplikacji zadeklarowanie dynamicznego zestawu typów MIME w filtrze intencji i zmodyfikowanie go programowo w czasie działania. Aby użyć grupy MIME, dodaj do pliku manifestu aplikacji 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 identyfikator ciągu, który identyfikuje grupę MIME w czasie działania. Możesz uzyskać dostęp do treści grupy MIME i zaktualizować je, przekazując jej identyfikator do poniższych nowych metod w klasie interfejsu API PackageManager
:
Gdy użyjesz programowo dodawania typu MIME do grupy MIME, będzie on działał dokładnie tak samo jak statyczny typ MIME jawnie zadeklarowany w pliku manifestu.
Ulepszenia autouzupełniania
Android 11 wprowadza ulepszenia usług autouzupełniania.
Identyfikatory wskazówek w AssistStructure.ViewNode
Usługi autouzupełniania często obliczają hasz podpisu widoku na podstawie jego właściwości. Wskazówka wyświetlania to szczególnie przydatna właściwość do uwzględnienia podczas obliczania hasza podpisu, ale ciąg znaków wskazówki może się zmieniać w zależności od lokalizacji telefonu. Aby rozwiązać ten problem, Android 11
rozszerza
AssistStructure.ViewNode
o nową metodę
getHintIdEntry()
zwracającą identyfikator zasobu dla tekstu podpowiedzi widoku. Ta metoda zapewnia wartość niezależną od języka, której można używać do obliczania skrótów podpisu.
Zdarzenia dotyczące wyświetlanych zbiorów danych
Aby pomóc usługom autouzupełniania w ulepszaniu sugestii, Android 11 umożliwia wykrywanie przypadków, w których usługa autouzupełniania przedstawiła zbiory danych, ale użytkownik nie wybrał żadnego z nich. W Androidzie 11 FillEventHistory
zgłasza nowy typ zdarzenia TYPE_DATASETS_SHOWN
. FillEventHistory
rejestruje zdarzenie tego typu za każdym razem, gdy usługa autouzupełniania przedstawia użytkownikowi co najmniej 1 zbiór 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 dostępnych opcji autouzupełniania.
Integracja z klawiaturą IME
Klawiatury i inne systemy IME mogą teraz wyświetlać sugestie autouzupełniania w ramce paska sugestii lub podobnego interfejsu zamiast w menu. Aby chronić informacje poufne, takie jak hasła czy 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 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 rejestrowania treści na urządzeniu. Ta funkcja ułatwia urządzeniu dostarczanie informacji kontekstowych, takich jak nazwa utworu, który jest obecnie odtwarzany w otoczeniu użytkownika.
Aby udostępnić dane z aplikacji usłudze rejestrowania treści, wywołaj metodę shareData()
w instancji ContentCaptureManager
. Jeśli system zaakceptuje prośbę o udostępnianie danych, Twoja aplikacja otrzyma opis pliku tylko do zapisu, który będzie można udostępnić usłudze rejestrowania treści.