Android 11 wprowadza programistów – świetne nowe funkcje i interfejsy API. W sekcjach poniżej znajdziesz informacje o funkcjach Twoich aplikacji i pierwsze kroki z powiązanymi interfejsami API.
Szczegółową listę nowych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie Różnice między interfejsami API. Szczegółowe informacje o nowych interfejsach API znajdziesz w dokumentacji interfejsu Android API, gdzie nowe interfejsy API są wyróżnione, aby były lepiej widoczne. Aby dowiedzieć się, w jakich obszarach zmiany na platformie mogą wpłynąć na Twoje aplikacje, zapoznaj się ze zmianami w działaniu Androida 11 aplikacji kierowanych na Androida R i wszystkich aplikacji, a także zmiany prywatności.
Nowe doświadczenia
Sterowanie urządzeniami
Android 11 zawiera nowy interfejs API ControlsProviderService
, który umożliwia udostępnianie ustawień dla połączonych urządzeń zewnętrznych. Te opcje są dostępne w sekcji Sterowanie urządzeniami w menu zasilania Androida. Więcej informacji znajdziesz w artykule Sterowanie urządzeniami zewnętrznymi.
Sterowanie multimediami
Android 11 aktualizuje sposób wyświetlania opcji sterowania multimediami. Elementy sterujące multimediami pojawią się obok szybkich ustawień. Sesje z różnych aplikacji są ułożone w przesuwanej karuzeli, która obejmuje strumienie odtwarzane lokalnie na telefonie, zdalne strumienie (np. wykryte na urządzeniach zewnętrznych lub sesje przesyłania) oraz wcześniejsze 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 korzysta z elementów sterujących multimediami w zwykły sposób.
Więcej informacji znajdziesz w artykule na temat sterowania multimediami.
Ekrany
Lepsza obsługa wyświetlaczy kaskadowych
Android 11 udostępnia kilka interfejsów API do obsługi ekranów kaskadowych wyświetlających się wokół krawędzi urządzenia. Są one traktowane jak wariant wyświetlaczy z wycięciami. Istniejące metody DisplayCutout
.getSafeInset…()
zwracają teraz bezpieczną wskazówkę, aby uniknąć obszarów kaskady oraz wycięć.
Aby wyrenderować zawartość aplikacji w obszarze kaskady, wykonaj te czynności:
Wywołaj metodę
DisplayCutout.getWaterfallInsets()
, aby uzyskać dokładne wymiary wstawki kaskady.Ustaw atrybut układu okna
layoutInDisplayCutoutMode
naLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
, aby okno mogło się rozszerzać na obszary wycięcia i kaskady na wszystkich krawędziach ekranu. Sprawdź, czy w wycięciu lub w kaskadzie nie ma żadnych istotnych treści.
Czujnik kąta zawiasu i urządzenia składane
Android 11 umożliwia aplikacjom działającym na urządzeniach z ekranami opartymi na zawiasach określanie kąta zawiasu dzięki nowemu czujnikowi (TYPE_HINGE_ANGLE
) i nowemu SensorEvent
, który może monitorować kąt zawiasu i pomiar w stopniach między 2 integralnymi częściami urządzenia. Za pomocą tych nieprzetworzonych pomiarów możesz tworzyć
szczegółowe animacje w czasie, gdy użytkownik manipuluje urządzeniem.
Zobacz Urządzenia składane.
rozmów,
Ulepszenia rozmów
Android 11 wprowadza wiele ulepszeń w obsłudze rozmów. Rozmowy to dwukierunkowa komunikacja w czasie rzeczywistym między co najmniej 2 osobami. Takie rozmowy są szczególnie widoczne, a użytkownicy mają dostęp do nowych opcji interakcji z nimi.
Więcej informacji o rozmowach i o tym, jak aplikacja może je obsługiwać, znajdziesz w artykule Osoby i rozmowy.
Dymki czatu
Dymki są teraz dostępne dla deweloperów, aby ułatwić wyświetlanie rozmów w systemie. Dymki to funkcja eksperymentalna w Androidzie 10, którą można było włączyć za pomocą opcji programisty. 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 będą wyświetlane jako dymki, chyba że nie spełniają nowych wymagań dotyczących rozmów. Powiadomienie musi być powiązane ze skrótem.
Przed Androidem 11, aby wyświetlać powiadomienie jako dymki, trzeba było wyraźnie wskazać, że powiadomienie ma się zawsze uruchamiać w trybie interfejsu dokumentu. Począwszy od Androida 11 nie trzeba już wybierać tego ustawienia. Jeśli powiadomienie wyświetla się w dymku, platforma automatycznie ustawia je tak, aby zawsze uruchamiały się w trybie interfejsu dokumentu.
Wprowadziliśmy wiele ulepszeń w zakresie bąbelków, a użytkownicy mają większą elastyczność włączania i wyłączania dymków w poszczególnych aplikacjach. W przypadku deweloperów, którzy wdrożyli pomoc eksperymentalną, wprowadziliśmy kilka zmian w interfejsach API w Androidzie 11:
- Konstruktor
BubbleMetadata.Builder()
bez parametrów został wycofany. Zamiast tego użyj jednego z 2 nowych konstruktorówBubbleMetadata.Builder(PendingIntent, Icon)
lubBubbleMetadata.Builder(String)
. - Utwórz
BubbleMetadata
na podstawie identyfikatora skrótu, wywołującBubbleMetadata.Builder(String)
. Przekazany ciąg powinien być zgodny z identyfikatorem skrótu podanym wNotification.Builder
. - Utwórz ikony dymków za pomocą metody
Icon.createWithContentUri()
lub nowej metodycreateWithAdaptiveBitmapContentUri()
.
Wskaźniki wizualne 5G
Więcej informacji o wyświetlaniu wskaźników 5G na urządzeniach użytkowników znajdziesz w artykule Poinformuj użytkowników, gdy korzystają 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ść.
Zabezpieczenia
Aktualizacje uwierzytelniania biometrycznego
Aby pomóc Ci kontrolować poziom bezpieczeństwa danych aplikacji, Android 11 udostępnia kilka ulepszeń uwierzytelniania biometrycznego. Te zmiany pojawią się też w bibliotece danych biometrycznych Jetpacka.
Typy uwierzytelniania
Android 11 wprowadza interfejs BiometricManager.Authenticators
, w którym możesz zadeklarować typy uwierzytelniania obsługiwane przez Twoją aplikację.
Sprawdzanie użytego typu uwierzytelniania
Po uwierzytelnieniu użytkownika możesz sprawdzić, czy uwierzytelnił się on za pomocą danych logowania urządzenia czy danych biometrycznych, wywołując metodę getAuthenticationType()
.
Dodatkowa obsługa kluczy uwierzytelniania na podstawie użycia
Android 11 zapewnia dodatkową obsługę uwierzytelniania z użyciem kluczy uwierzytelniania z użyciem kluczy.
Wycofane metody
Android 11 wycofuje te metody:
- Metoda
setDeviceCredentialAllowed()
. - Metoda
setUserAuthenticationValidityDurationSeconds()
. - Przeciążona wersja
canAuthenticate()
, która nie przyjmuje argumentów.
Bezpieczne udostępnianie dużych zbiorów danych
W niektórych sytuacjach, np. związanych z systemami uczącymi się lub odtwarzaniem multimediów, aplikacja może używać tego samego dużego zbioru danych co inna aplikacja. W poprzednich wersjach Androida aplikacja i inna aplikacja muszą pobrać oddzielną kopię tego samego zbioru danych.
Aby ograniczyć nadmiarowość danych, zarówno w sieci, jak i na dysku, Android 11 umożliwia przechowywanie tych dużych zbiorów danych na urządzeniu za pomocą udostępnionych blobów danych. Więcej informacji o udostępnianiu zbiorów danych znajdziesz w szczegółowym przewodniku po udostępnianiu dużych zbiorów danych.
Stosuj szyfrowanie na podstawie plików po ponownym uruchomieniu OTA bez danych logowania użytkownika
Gdy urządzenie zakończy aktualizację OTA i uruchomi się ponownie, klucze CE (dane uwierzytelniające) umieszczone w magazynie chronionej danymi uwierzytelniającymi będą od razu dostępne do operacji szyfrowania opartego na plikach (FBE). Oznacza to, że po aktualizacji OTA aplikacja może wznowić operacje, które wymagają kluczy CE, zanim użytkownik wpisze kod PIN, wzór lub hasło.
Wydajność i jakość
Debugowanie bezprzewodowe
Android 11 umożliwia bezprzewodowe wdrażanie i debugowanie aplikacji na stacji roboczej za pomocą Android Debug Bridge (adb). Możesz na przykład wdrożyć aplikację możliwą do debugowania na wielu urządzeniach zdalnych bez fizycznego podłączania urządzenia przez USB i rywalizacji z typowymi problemami z połączeniem USB, takimi jak instalacja sterowników. Więcej informacji znajdziesz w artykule Uruchamianie aplikacji na urządzeniu.
Przyrostowa instalacja pakietu APK ADB
Instalacja dużych plików APK (ponad 2 GB) na urządzeniu może zająć dużo czasu, nawet jeśli w aplikacji zostanie wprowadzona tylko niewielka zmiana. Przyspieszona instalacja ADB (Android Debug Bridge) przyspiesza ten proces, instalując wystarczającą ilość pliku APK do uruchomienia aplikacji, a pozostałe dane są przesyłane strumieniowo w tle. adb install
używa tej funkcji automatycznie, jeśli urządzenie ją obsługuje i masz zainstalowaną najnowszą wersję SDK Platform-Narzędzia. Jeśli nie jest obsługiwana, używana jest domyślna metoda instalacji, która zostanie użyta w sposób dyskretny.
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 przeprowadzisz przyrostową instalację pakietu APK ADB, musisz go podpisać i utworzyć plik schematu podpisu APK w wersji 4. Aby ta funkcja działała, obok pliku APK należy umieścić plik podpisu w wersji 4.
Wykrywanie błędów przy użyciu przydziału pamięci natywnej
GWP-ASan to natywna funkcja przydzielania pamięci, która pomaga wykrywać błędy „use-after-free” i błędy przepełnienia bufora na stercie. Możesz włączyć tę funkcję globalnie lub dla określonych podprocesów w aplikacji. Więcej informacji znajdziesz w przewodniku GWP-Asan.
Neural Networks API 1.3
Android 11 rozszerza i ulepsza Neural Networks API (NNAPI).
Nowe operacje
NNAPI 1.3 wprowadza nowy typ operandu TENSOR_QUANT8_ASYMM_SIGNED
, który obsługuje nowy schemat kwantyzacji TensorFlow Lite.
Dodatkowo NNAPI 1.3 udostępnia te nowe operacje:
QUANTIZED_LSTM
IF
WHILE
ELU
HARD_SWISH
FILL
RANK
Nowe ustawienia systemów uczących się
NNAPI 1.3 wprowadza nowe elementy sterujące, które pomagają uczeniu maszynowemu działać płynnie:
Interfejs QoS API: nowy interfejs Quality of Service API zapewnia obsługę ustalania priorytetów i terminów zadań w NNAPI oraz udostępnia 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 do wykonania. Pozwala to usunąć niepotrzebne kopie tych samych danych między różnymi komponentami systemu, co usprawnia działanie sieci neuronowych Androida. Ta funkcja dodaje zestaw nowych interfejsów API NDK do użycia z obiektami
ANeuralNetworksMemoryDesc
iANeuralNetworkMemory
, w tym z tymi funkcjami:ANeuralNetworksMemoryDesc_create()
ANeuralNetworksMemoryDesc_free()
ANeuralNetworksMemoryDesc_addInputRole()
ANeuralNetworksMemoryDesc_addOutputRole()
ANeuralNetworksMemoryDesc_setDimensions()
ANeuralNetworksMemoryDesc_finish()
ANeuralNetworksMemory_createFromDesc()
ANeuralNetworksMemory_copy()
Więcej informacji znajdziesz na przykładzie domeny pamięci sieci neuronowej.
Obsługa interfejsu Dependency API i synchronizacji zabezpieczeń: NNAPI 1.3 zapewnia obsługę obliczeń asynchronicznych z zależnościami, co pozwala znacznie zmniejszyć narzut przy wywoływaniu małych łańcuchowych modeli. Ta funkcja dodaje te nowe funkcje:
Proces sterowania: NNAPI 1.3 obsługuje ogólny przepływ sterowania za pomocą nowych operacji na wykresie
ANEURALNETWORKS_IF
iANEURALNETWORKS_WHILE
, w których jako argumenty używane są inne modele korzystające z nowego typu argumentuANEURALNETWORKS_MODEL
. Oprócz tego ta funkcja dodaje te nowe funkcje:
Interfejs NDK Thermal API
Gdy urządzenia się nagrzeją, mogą spowalniać procesor lub GPU, co może w nieoczekiwany sposób wpływać na aplikacje. W przypadku aplikacji i gier, które zawierają złożoną grafikę, intensywnie obliczenia lub długotrwałą aktywność sieciową, problemy często występują.
Używaj interfejsu NDK Thermal API w Androidzie 11 do monitorowania zmian temperatury na urządzeniu, a następnie podejmij działania, aby utrzymać niższe zużycie energii i niższą temperaturę urządzenia. Ten interfejs API jest podobny do interfejsu Java Thermal API. Możesz go używać do odbierania powiadomień o zmianach stanu termicznego lub do bezpośredniego badania bieżącego stanu.
Tekst i metody wprowadzania
Ulepszone przejścia IME
Android 11 wprowadza nowe interfejsy API, aby usprawnić przejścia w edytorach metod wprowadzania (IME), takich jak klawiatury ekranowe. Ułatwiają one dostosowanie zawartości aplikacji zgodnie z wyglądem i znikaniem IME oraz z innymi elementami, takimi jak paski stanu i nawigacyjne.
Aby wyświetlić edytor IME, gdy wybrany jest dowolny EditText
, wywołaj view.getInsetsController().show(Type.ime())
.
(Tę metodę możesz wywoływać w dowolnym widoku danych w tej samej hierarchii co wybrany element EditText
. Nie musisz go wywoływać bezpośrednio w elemencie EditText
). Aby ukryć edytor IME, wywołaj view.getInsetsController().hide(Type.ime())
.
Aby sprawdzić, czy dany edytor IME jest obecnie widoczny, wywołaj view.getRootWindowInsets().isVisible(Type.ime())
.
Aby zsynchronizować widoki aplikacji z wyglądem i zniknięciem IME, ustaw detektor dla widoku, dodając WindowInsetsAnimation.Callback
do View.setWindowInsetsAnimationCallback()
.
Możesz go ustawić w dowolnym widoku – nie musi to być widok EditText
. IME wywołuje metodę onPrepare()
Twojego detektora, a następnie wywołuje onStart()
na początku przejścia. Następnie wywołuje metodę onProgress()
przy każdym przejściu w trakcie przejścia. Po zakończeniu przenoszenia IME wywołuje onEnd()
.
W dowolnym momencie procesu przenoszenia możesz sprawdzić postępy, wywołując metodę WindowInsetsAnimation.getFraction()
.
Przykład korzystania z tych interfejsów API znajdziesz w nowym przykładowym kodzie WindowInsetsAnimation.
Sterowanie animacją IME
Możesz też kontrolować animację IME oraz animację innego paska systemowego, np. paska nawigacyjnego. W tym celu najpierw wywołaj metodę setOnApplyWindowInsetsListener()
, aby ustawić nowy detektor zmian wstawionych okien:
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()
kontrolera:
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
tak, aby wykorzystywał wersję 66 biblioteki IU, a nie wersję 63 w Androidzie 10. Nowa wersja biblioteki zawiera zaktualizowane dane języka CLDR oraz szereg ulepszeń obsługi internacjonalizacji w Androidzie.
Najważniejsze zmiany w nowych wersjach biblioteki to między innymi:
- Wiele interfejsów API formatowania obsługuje teraz nowy typ obiektu zwracanego, który jest rozszerzeniem
FormattedValue
. - Interfejs API
LocaleMatcher
został ulepszony o klasę kreatora, obsługę typujava.util.Locale
oraz klasę wyników z dodatkowymi danymi o dopasowaniu. - Obsługujemy teraz kodowanie Unicode 13.
Multimedia
Przydzielanie buforów MediaCodec
Android 11 zawiera nowe interfejsy API MediaCodec
, które dają 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()
Zmieniło się też działanie 2 metod w MediaCodec.Callback()
:
onInputBufferAvailable()
- Zamiast wywoływać przy użyciu indeksu
MediaCodec.getInputBuffer()
iMediaCodec.queueInputBuffer()
za pomocą indeksu, jeśli skonfigurowano do używania interfejsu Block Model API, aplikacje powinny używać z indeksemMediaCodec.getQueueRequest
, dołączając do boksu element LinearBlock/HardwareBuffer. onOutputBufferAvailable()
- Zamiast wywoływać
MediaCodec.getOutputBuffer()
przy użyciu indeksu aplikacje mogą używaćMediaCodec.getOutputFrame()
z indeksem do pobierania obiektuOutputFrame
z dodatkowymi informacjami i buforów LinearBlock/HardwareBuffer.
Dekodowanie z małym opóźnieniem w MediaCodec
Android 11 ulepsza MediaCodec
, aby umożliwić dekodowanie gier i innych aplikacji działających w czasie rzeczywistym z małym opóźnieniem. Aby sprawdzić, czy kodek obsługuje dekodowanie z małym opóźnieniem, przekaż parametr FEATURE_LowLatency
do MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
Aby włączyć lub wyłączyć dekodowanie z małym opóźnieniem, wykonaj jedną z tych czynności:
- Ustaw nowy klucz
KEY_LOW_LATENCY
na 0 lub 1 za pomocąMediaCodec.configure()
. - Ustaw nowy klucz parametru
PARAMETER_KEY_LOW_LATENCY
na 0 lub 1 za pomocą funkcjiMediaCodec.setParameters()
.
Nowa funkcja AAudio AAudioStream_release()
Funkcja AAudioStream_close()
jednocześnie uruchamia i zamyka strumień audio. Może to być niebezpieczne. Jeśli inny proces spróbuje uzyskać dostęp do strumienia po jego zamknięciu, spowoduje to awarię.
Nowa funkcja AAudioStream_release()
zwalnia strumień, ale go nie zamyka. Spowoduje to uwolnienie zasobów
i pozostawienie strumienia w znanym stanie. Obiekt będzie się utrzymywać, dopóki nie wywołasz AAudioStream_close()
.
Interfejs API MediaParser
MediaParser to nowy, niski poziom interfejsu API do wyodrębniania multimediów. Jest bardziej elastyczny niż MediaExtractor i zapewnia dodatkową kontrolę nad funkcją wyodrębniania multimediów.
Przechwycony dźwięk z urządzenia USB
Gdy aplikacja bez uprawnień RECORD_AUDIO
używa UsbManager
, aby poprosić o bezpośredni dostęp do urządzenia audio USB obsługującego nagrywanie dźwięku (np. zestawu słuchawkowego USB), pojawi się nowe ostrzeżenie z prośbą o potwierdzenie uprawnień do korzystania z urządzenia. System ignoruje opcję „Zawsze używaj”, więc użytkownik musi zaakceptować ostrzeżenie i przyznać uprawnienia za każdym razem, gdy aplikacja poprosi o dostęp.
Aby tego uniknąć, 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 włączają i wyłączają możliwość jednoczesnego przechwytywania niezależnie od wybranego przypadku użycia. Zobacz Udostępnianie wejścia audio.
Przełącznik wyjścia
Android 11 wprowadza nowe zachowanie aplikacji, które korzystają z interfejsów API Cast i mediarouter.
Opcje przesyłania są dostępne nie tylko z poziomu aplikacji, ale też w systemowym odtwarzaczu. Pomaga to zapewnić użytkownikom płynną podróż między urządzeniami, gdy zmienia kontekst oglądania i słuchania. Może to być np. oglądanie filmu w kuchni i telefonie lub słuchanie dźwięku w domu albo w samochodzie. Zobacz przełącznik wyjścia.
Połączenia
Ulepszenia protokołu Wi-Fi Passpoint
Więcej informacji o funkcjach Passpoint dodanych w Androidzie 11 znajdziesz na stronie Passpoint.
Interfejs Wi-Fi suggestion API jest rozwinięty
Android 11 rozszerza interfejs Wi-Fi Suggestions API, aby zwiększyć możliwości zarządzania siecią w aplikacji, w tym:
- Aplikacje do zarządzania połączeniami mogą zarządzać własnymi sieciami, zezwalając na prośby o odłączenie.
- Sieci Passpoint są zintegrowane z interfejsem suggestion API i mogą być sugerowane użytkownikowi.
- Interfejsy Analytics API umożliwiają uzyskanie informacji o jakości Twoich sieci.
Aktualizacje usługi CallScreeningService
Począwszy od Androida 11 usługa CallScreeningService może prosić o informacje o stanie weryfikacji STIR/SHAKEN dla połączeń przychodzących. Te informacje są podane jako część szczegółów połączeń dotyczących połączeń przychodzących.
Jeśli CallScreeningService
ma uprawnienie READ_CONTACTS
, aplikacja otrzyma powiadomienie o przychodzących połączeniach przychodzących lub wychodzących z numeru znajdującego się w kontaktach użytkownika.
Więcej informacji znajdziesz w artykule Zapobieganie podszywaniu się pod ID rozmówcy.
Otwórz aktualizacje Mobile API
Informacje o obsłudze OMAPI w Androidzie 11 i nowszych znajdziesz w artykule Obsługa czytnika 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 interfejsem API na poziomie 29 lub wyższym mogą stosować do sieci VPN połączenia IKEv2/IPsec zarówno w sieciach VPN skonfigurowanych przez użytkownika, jak i w aplikacjach.
Sieci VPN działają bezpośrednio w systemie operacyjnym, dzięki czemu upraszczają kod wymagany do nawiązania w aplikacji połączeń VPN IKEv2/IPsec.
Kontrola dostępu do sieci według procesu
Informacje o włączaniu dostępu do sieci dla poszczególnych procesów znajdziesz w artykule Zarządzanie wykorzystaniem sieci.
Zezwalaj na wiele zainstalowanych konfiguracji Passpoint z tą samą pełną i jednoznaczną nazwą domeny
Od Androida 11 możesz używać PasspointConfiguration.getUniqueId()
do uzyskiwania unikalnego identyfikatora obiektu PasspointConfiguration
, co pozwala użytkownikom aplikacji instalować wiele profili z tą samą pełną i jednoznaczną nazwą domeny.
Ta funkcja jest przydatna, gdy operator ma w swojej sieci więcej niż jedną kombinację kodu kraju mobilnego (MCK) i kodu sieci komórkowej (MNC), ale ma tylko jedną pełną i jednoznaczną nazwę domeny. Na Androidzie 11 i nowszych można zainstalować więcej niż 1 profil z tą samą pełną i jednoznaczną nazwą domeny, który będzie pasował do sieci co dostawca Home, gdy użytkownik zainstaluje kartę SIM z MCK lub MNC.
Obsługa anteny GNSS
Android 11 wprowadza klasę GnssAntennaInfo
, która umożliwia aplikacji większe wykorzystanie dokładności centymetrowej zapewnianej przez globalny system nawigacji satelitarnej.
Więcej informacji znajdziesz w przewodniku po informacjach o kalibracji anteny.
Grafika
Dekoder obrazów NDK
NDK ImageDecoder
API udostępnia standardowy interfejs API dla aplikacji na Androida w języku C/C++ do bezpośredniego dekodowania obrazów. Deweloperzy aplikacji nie muszą już używać interfejsów API platformy (przez JNI) ani pakietów bibliotek do dekodowania obrazów innych firm. Więcej informacji znajdziesz w przewodniku dla programistów po dekoderze obrazów.
Interfejs API liczby klatek
Android 11 udostępnia interfejs API, który umożliwia aplikacjom informowanie systemu o zamierzonej liczbie klatek, co pozwala ograniczyć szum na urządzeniach, które obsługują wiele częstotliwości odświeżania. Informacje o korzystaniu z tego interfejsu API znajdziesz w przewodniku po liczbie klatek.
Żądanie i sprawdzanie obsługi niskiego opóźnienia
Niektóre wyświetlacze, np. zewnętrzne czy telewizory, mogą przetwarzać przetwarzanie grafiki. Poprawia to grafikę, ale może wydłużyć czas oczekiwania. Nowsze ekrany obsługujące HDMI 2.1 mają automatyczny tryb niskiego opóźnienia (ALLM, nazywany też trybem gry), który minimalizuje opóźnienie dzięki wyłączeniu tego procesu końcowego. Więcej informacji o ALLM znajdziesz w specyfikacji HDMI 2.1.
Okno może zażądać zastosowania automatycznego trybu niskiego opóźnienia, jeśli jest on dostępny. ALLM przydaje się zwłaszcza w aplikacjach takich jak gry i konferencje wideo, w których małe 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 go obsługuje, wywołaj nową metodę Display.isMinimalPostProcessingSupported()
.
Wstrzykiwanie warstwy debugowania grafiki Performant
Aplikacje mogą teraz wczytywać zewnętrzne warstwy graficzne (GLES, Vulkan) do kodu aplikacji natywnej, aby prezentować te same funkcje co aplikacja z możliwością debugowania, ale bez zwiększania wydajności. Ta funkcja jest szczególnie ważna podczas profilowania aplikacji za pomocą narzędzi takich jak GAPID. Aby profilować aplikację, zamiast zezwalać na debugowanie aplikacji, umieść w pliku manifestu aplikacji ten element meta-data:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Obrazy i aparat
Wycisz dźwięki i wibracje powiadomień podczas aktywnego nagrywania
Począwszy od Androida 11, gdy aktywnie korzysta się z aparatu, aplikacja może wyciszyć tylko wibracje, zarówno dźwięki, jak i wibracje. Możliwe też, że przy użyciu setCameraAudioRestriction()
nie będzie można wyciszać żadnych wibracji.
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 kilku kamer jednocześnie.
Android 11 dodaje interfejsy API, aby umożliwić użytkownikom korzystanie z więcej niż 1 aparatu jednocześnie, w tym z przedniego i tylnego aparatu.
Aby sprawdzić dostępność pomocy na urządzeniu, na którym działa Twoja aplikacja, wykonaj te czynności:
getConcurrentCameraIds()
zwracaSet
kombinacji identyfikatorów kamer, które mogą transmitować równocześnie z gwarantowanymi kombinacjami strumieni, jeśli są skonfigurowane w tym samym procesie aplikacji.isConcurrentSessionConfigurationSupported()
sprawdza, czy urządzenia z aparatami mogą równocześnie obsługiwać odpowiednie konfiguracje sesji.
Lepsza obsługa obrazów HEIF z wieloma klatkami
Począwszy od Androida 11, jeśli wywołasz metodę ImageDecoder.decodeDrawable()
i prześlesz obraz HEIF zawierający sekwencję klatek (np. animację lub seryjne zdjęcie), metoda zwróci AnimatedImageDrawable
zawierającą całą sekwencję obrazów. We wcześniejszych wersjach Androida metoda zwróciła wartość BitmapDrawable
wynoszącą tylko jedną klatkę.
Jeśli grafika HEIF zawiera wiele klatek, które nie występują w sekwencji, możesz pobrać pojedynczą klatkę, wywołując metodę MediaMetadataRetriever.getImageAtIndex()
.
Ułatwienia dostępu
Aktualności dla deweloperów usług ułatwień dostępu
Jeśli utworzysz niestandardową usługę ułatwień dostępu, w Androidzie 11 będziesz mieć możliwość korzystania z tych funkcji:
- Wyjaśnienie działania usługi ułatwień dostępu dla użytkownika umożliwia teraz stosowanie oprócz zwykłego tekstu kodu HTML i obrazów. Dzięki temu łatwiej objaśnisz użytkownikom, do czego służy Twoja usługa i jak może im pomóc.
- Aby użyć bardziej semantycznego opisu stanu elementu interfejsu niż
contentDescription
, wywołaj metodęgetStateDescription()
. - Aby zdarzenia dotyku pomijały systemowy Eksplorator dotyku, wywołaj
setTouchExplorationPassthroughRegion()
. I podobnie, aby zażądać, by gesty pomijały detektor gestów systemu, wywołajsetGestureDetectionPassthroughRegion()
. - Możesz wysyłać żądania działań IME (np. „Enter” i „next”), a także zrzuty ekranu okien, w których nie ma flagi
FLAG_SECURE
.
Inne funkcje
Przyczyny opuszczenia procesu aplikacji
Android 11 wprowadza metodę ActivityManager.getHistoricalProcessExitReasons()
, która zgłasza przyczyny niedawnych zakończenia procesów. Aplikacje mogą używać tej metody do zbierania informacji diagnostycznych o awariach, na przykład o tym, czy zakończenie procesu jest spowodowane błędami ANR, problemami z pamięcią lub innymi przyczynami.
Możesz też używać nowej metody setProcessStateSummary()
do przechowywania niestandardowych informacji o stanie do późniejszej analizy.
Metoda getHistoricalProcessExitReasons()
zwraca instancje klasy ApplicationExitInfo
, która zawiera informacje dotyczące śmierci procesu aplikacji. Wywołując getReason()
w instancji tej klasy, możesz ustalić, dlaczego proces aplikacji został zatrzymany. Na przykład zwracana wartość REASON_CRASH
oznacza, że w aplikacji wystąpił nieobsługiwany wyjątek. Jeśli aplikacja musi zapewniać niepowtarzalność zdarzeń wyjściowych, może zachować identyfikator aplikacji, taki jak wartość skrótu na podstawie sygnatury czasowej z metody getTimestamp()
.
Dodatkowe materiały
Więcej informacji znajdziesz w artykule o nowych narzędziach Androida 11, które zwiększają prywatność i stabilność aplikacji w Medium.
Moduły wczytujące zasoby
Android 11 wprowadza nowy interfejs API, który pozwala aplikacjom dynamicznie rozszerzać sposób wyszukiwania i wczytywania zasobów. Za udostępnianie nowych funkcji odpowiadają przede wszystkim nowe klasy interfejsu API ResourcesLoader
i ResourcesProvider
. Razem pozwalają one dostarczać dodatkowe zasoby lub modyfikować wartości istniejących zasobów.
Obiekty 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 przypadków użycia tego interfejsu API jest ładowanie zasobów niestandardowych. Za pomocą loadFromDirectory()
możesz utworzyć ResourcesProvider
, który przekierowuje rozdzielczość zasobów i zasobów opartych na plikach w taki sposób, że przeszukuje się określony katalog, a nie plik APK aplikacji. Dostęp do tych zasobów możesz uzyskać, korzystając z rodziny metod open()
z klasy interfejsu API AssetManager
, tak jak w przypadku zasobów zawartych w pliku APK.
Schemat podpisu APK w wersji 4
W Androidzie 11 wprowadziliśmy obsługę schematu podpisu plików APK w wersji 4. Ten schemat generuje nowy rodzaj podpisu w oddzielnym pliku (apk-name.apk.idsig
), ale poza tym jest podobny do wersji 2 i 3. Plik APK nie wprowadza żadnych zmian. Ten schemat obsługuje instalację przyrostową pakietu APK ADB, co przyspiesza instalację pliku APK.
Filtry intencji dynamicznych
Aby otrzymywać intencje, aplikacja musi podczas kompilowania zadeklarować, jakie typy danych może otrzymywać. W tym celu należy zdefiniować filtr intencji w manifeście aplikacji. W Androidzie 10 i starszych wersjach aplikacje nie mogą zmieniać filtrów intencji w czasie działania. Stanowi to problem w przypadku aplikacji wirtualizacji (takich jak maszyny wirtualne czy pulpity zdalne), ponieważ nie mają możliwości sprawdzenia, jakie oprogramowanie zainstaluje w nich użytkownik.
Android 11 wprowadza grupy MIME – nowy element 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, umieść element danych w pliku manifestu aplikacji 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ścią atrybutu android:mimeGroup
jest dowolny identyfikator ciągu znaków, który identyfikuje grupę MIME w czasie działania. Aby uzyskać dostęp do grupy MIME i ją aktualizować, przekaż jej identyfikator do nowej metody w klasie API PackageManager
:
Gdy programowo dodajesz typ MIME do grupy MIME, działa on tak samo jak statyczny typ MIME jawnie zadeklarowany w pliku manifestu.
Ulepszenia autouzupełniania
Android 11 wprowadza ulepszenia autouzupełniania.
Identyfikatory podpowiedzi w AssistStructured.ViewNode
Usługi autouzupełniania często przydają się do obliczania haszu podpisu dla widoku na podstawie jego właściwości. Podczas obliczania haszy podpisu warto uwzględnić podpowiedź dotyczącą wyświetlenia, ale ciąg podpowiedzi może się zmieniać w zależności od języka telefonu. Aby rozwiązać ten problem, Android 11 rozwija metodę AssistStructure.ViewNode
o nową metodę getHintIdEntry()
, która zwraca identyfikator zasobu tekstu podpowiedzi widoku. Ta metoda zapewnia wartość niezależną od języka, której można używać do obliczania haszów podpisu.
Zdarzenia wyświetlone w zbiorze danych
Aby pomóc usługom autouzupełniania poprawić sugestie, Android 11 udostępnia sposób wykrywania 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 IME
Klawiatury i inne edytory IME mogą teraz wyświetlać sugestie autouzupełniania w tekście, na pasku sugestii lub w podobnym interfejsie, 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 edytorowi IME, dopóki użytkownik ich nie wybierze. Informacje o tym, jak edytory IME i menedżery haseł obsługują tę funkcję, znajdziesz w artykule Integrowanie autouzupełniania z klawiaturami.
Udostępnianie danych usłudze przechwytywania treści
Od Androida 11 aplikacja może udostępniać dane usłudze do przechwytywania treści na urządzeniu. Ta funkcja ułatwia urządzeniu analizowanie kontekstu, np. wyświetlanie tytułu utworu, który jest obecnie odtwarzany w środowisku użytkownika.
Aby udostępnić dane z aplikacji usłudze przechwytywania treści, wywołaj metodę shareData()
w instancji ContentCaptureManager
. Jeśli system zaakceptuje prośbę o udostępnienie danych, aplikacja otrzyma deskryptor pliku tylko do zapisu i udostępni go usłudze przechwytywania treści.