Android 11 wprowadza nowe, przydatne funkcje i interfejsy API dla deweloperów. W sekcjach poniżej poznasz funkcje aplikacji i rozpoczniesz korzystanie z powiązanych z nimi interfejsów 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 interfejsów API Androida. Nowe interfejsy API są wyróżniane pod względem widoczności. Aby dowiedzieć się, w jakich obszarach zmiany na platformie mogą wpływać na Twoje aplikacje, sprawdź zmiany w działaniu Androida 11 w aplikacjach kierowanych na Androida R i dla wszystkich aplikacji, a także na zmiany prywatności.
Nowe funkcje
Sterowanie urządzeniami
Android 11 zawiera nowy interfejs API ControlsProviderService
, który umożliwia udostępnianie elementów sterujących połączonym urządzeniom zewnętrznym. Te elementy sterujące są dostępne w sekcji Sterowanie urządzeniem 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 są widoczne w pobliżu szybkich ustawień. Sesje z wielu aplikacji wyświetlają się w przesuwanej karuzeli obejmującej strumienie odtwarzane lokalnie na telefonie, strumienie zdalne (np. wykryte na urządzeniach zewnętrznych lub sesje przesyłania) oraz wcześniejsze, wznawiane sesje w kolejności od ostatniej odtworzenia.
Użytkownicy mogą ponownie uruchamiać poprzednie sesje z karuzeli bez konieczności uruchamiania aplikacji. Po rozpoczęciu odtwarzania użytkownik w zwykły sposób wchodzi w interakcję z elementami sterującymi multimediami.
Więcej informacji znajdziesz w artykule Sterowanie multimediami.
Ekrany
Lepsza obsługa wyświetlaczy kaskadowych
Android 11 udostępnia kilka interfejsów API do obsługi wyświetlaczy kaskadowych, które mieszczą się wokół krawędzi urządzenia. Są one traktowane jak warianty
reklam displayowych z wycięciem w ekranie. Dotychczasowe metody DisplayCutout
.getSafeInset…()
zwracają teraz bezpieczny układ, aby uniknąć obszarów kaskadowych i wycięć.
Aby wyrenderować zawartość aplikacji w obszarze kaskady:
Wywołaj metodę
DisplayCutout.getWaterfallInsets()
, aby uzyskać dokładne wymiary wstawienia w kaskadzie.Ustaw atrybut układu okna
layoutInDisplayCutoutMode
naLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
, aby umożliwić rozszerzenie okna w obszary wycięcia i kaskady na wszystkich krawędziach ekranu. Upewnij się, że w obszarach z wycięciem lub wodospadem nie ma żadnych istotnych treści.
Urządzenia składane i czujnik kąta zawiasów
Android 11 umożliwia aplikacjom działającym na urządzeniach z konfiguracją ekranu opartego na zawiasie określanie kąta zawiasu. Udostępniamy nowy czujnik z TYPE_HINGE_ANGLE
oraz nowy czujnik SensorEvent
, który monitoruje kąt zawiasów i podaje pomiar między 2 integralnymi częściami urządzenia w stopniach. Możesz używać tych nieprzetworzonych pomiarów do wykonywania szczegółowych animacji podczas obsługi urządzenia przez użytkownika.
Zobacz Urządzenia składane.
rozmów,
Ulepszenia rozmowy
W Androidzie 11 wprowadzono wiele ulepszeń w sposobie obsługi rozmów. Rozmowy to dwukierunkowa komunikacja w czasie rzeczywistym między dwiema lub większą liczbą osób. Takie rozmowy są szczególnie widoczne, a użytkownicy mają do dyspozycji kilka 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 całym systemie. Dymki były funkcją eksperymentalną w Androidzie 10, którą można było włączyć za pomocą opcji dla programistów. W Androidzie 11 już ich nie trzeba.
Jeśli aplikacja jest kierowana na Androida 11 (poziom interfejsu API 30) lub nowszego, jej powiadomienia nie są wyświetlane jako dymki, chyba że spełniają nowe wymagania dotyczące rozmów. W szczególności powiadomienie musi być powiązane ze skrótem.
Wcześniej, aby powiadomienie było wyświetlane w dymkach, trzeba było wyraźnie zaznaczyć, że jest ono zawsze uruchamiane w trybie interfejsu dokumentu. Począwszy od Androida 11 nie trzeba już wybierać tego ustawienia. Jeśli powiadomienie wyświetla się jako dymki, platforma automatycznie ustawia je tak, aby zawsze uruchamiało się w trybie interfejsu dokumentu.
Wprowadziliśmy wiele ulepszeń w zakresie działania dymków, a użytkownicy mają większą elastyczność włączania i wyłączania dymków w każdej aplikacji. Dla deweloperów, którzy wdrożyli obsługę eksperymentalną, wprowadziliśmy kilka zmian w interfejsach API Androida 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
z identyfikatora skrótu, wywołującBubbleMetadata.Builder(String)
. Przekazany ciąg znaków powinien być zgodny z identyfikatorem skrótu podanym wNotification.Builder
. - Utwórz ikony dymków za pomocą
Icon.createWithContentUri()
lub nowej metodycreateWithAdaptiveBitmapContentUri()
.
wizualne wskaźniki 5G
Informacje o wyświetlaniu wskaźników 5G na urządzeniach użytkowników znajdziesz w artykule Informowanie użytkowników, gdy korzystają z 5G.
prywatność
W Androidzie 11 wprowadzamy wiele zmian i ograniczeń, aby lepiej chronić prywatność użytkowników. Więcej informacji znajdziesz na stronie Prywatność.
Zabezpieczenia
Aktualizacje uwierzytelniania biometrycznego
Aby pomóc Ci kontrolować poziom bezpieczeństwa danych w aplikacji, Android 11 udostępnia kilka ulepszeń w zakresie uwierzytelniania biometrycznego. Te zmiany pojawią się też w bibliotece biometrycznej Jetpacka.
Typy uwierzytelniania
Android 11 wprowadza interfejs BiometricManager.Authenticators
, za pomocą którego możesz zadeklarować typy uwierzytelniania obsługiwane przez aplikację.
Określ używany typ uwierzytelniania
Po uwierzytelnieniu użytkownika możesz sprawdzić, czy został uwierzytelniony za pomocą danych logowania urządzenia lub danych biometrycznych, wywołując metodę getAuthenticationType()
.
Dodatkowa obsługa kluczy uwierzytelniania na podstawie użycia
Android 11 zapewnia większą obsługę uwierzytelniania za pomocą kluczy uwierzytelniania za pomocą kluczy.
Wycofane metody
W Androidzie 11 te metody wycofujemy:
- 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. związanych z systemami uczącymi się lub odtwarzaniem multimediów, aplikacja może chcieć używać tego samego dużego zbioru danych co inna aplikacja. We wcześniejszych wersjach Androida aplikacja i inna aplikacja muszą pobrać oddzielną kopię tego samego zbioru danych.
Aby zmniejszyć nadmiarowość danych zarówno w sieci, jak i na dysku, Android 11 zezwala na zapisywanie dużych zbiorów danych w pamięci podręcznej 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.
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 szyfrowane za pomocą danych logowania (CE) umieszczone w pamięci chronionej danymi logowania natychmiast staną się dostępne dla operacji szyfrowania za pomocą pliku (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ę z możliwością 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 sterownika. Więcej informacji znajdziesz w artykule Uruchamianie aplikacji na urządzeniu sprzętowym.
Instalacja dodatkowego pakietu APK ADB
Instalacja dużych pakietów APK (ponad 2 GB) na urządzeniu może zająć dużo czasu, nawet jeśli w aplikacji wprowadzasz tylko niewielką zmianę. Przyrostowa instalacja plików APK przyspieszonych przez ADB (Android Debug Bridge) Jeśli urządzenie będzie obsługiwać tę funkcję automatycznie, adb install
będzie używać tej funkcji automatycznie, a Ty masz zainstalowaną najnowszą wersję Narzędzia platformy SDK. Jeśli nie jest obsługiwana, zostanie użyta domyślna metoda instalacji.
Aby użyć tej funkcji, użyj tego polecenia adb. Jeśli urządzenie nie obsługuje instalacji przyrostowej, polecenie kończy się niepowodzeniem i wyświetla szczegółowe wyjaśnienie.
adb install --incremental
Przed uruchomieniem przyrostowej instalacji pliku APK ADB musisz go podpisać i utworzyć plik schematu podpisu pliku APK w wersji 4. Aby ta funkcja działała, plik podpisu w wersji 4 musi znajdować się obok pakietu APK.
Wykrywanie błędów za pomocą alokatora pamięci natywnej
GWP-ASan to natywna funkcja alokacji pamięci, która ułatwia znajdowanie błędów typu „use-after-free” i „przepełnienia bufora sterty”. Tę funkcję możesz włączyć globalnie lub w przypadku określonych podprocesów aplikacji. Więcej informacji znajdziesz w przewodniku po GWP-Asan.
Neural Networks API 1.3
Android 11 rozwija i ulepsza Neural Networks API (NNAPI).
Nowe operacje
NNAPI 1.3 wprowadza nowy typ operandu (TENSOR_QUANT8_ASYMM_SIGNED
), aby obsługiwać nowy schemat kwantyzacji w TensorFlow Lite.
Dodatkowo w NNAPI 1.3 wprowadziliśmy te nowe operacje:
QUANTIZED_LSTM
IF
WHILE
ELU
HARD_SWISH
FILL
RANK
Nowe opcje systemów uczących się
W NNAPI 1.3 wprowadziliśmy nowe funkcje, które pomagają systemom uczącym się działać sprawnie:
QoS API: nowy interfejs Quality of Service API zapewnia obsługę priorytetów i terminów zadań w NNAPI. Dostępne są te nowe funkcje:
Wejście/wyjście domeny pamięci: NNAPI 1.3 zapewnia obsługę domen pamięci jako danych wejściowych i wyjściowych podczas wykonywania. Spowoduje to usunięcie zbędnych kopii tych samych danych z różnych komponentów systemu, co poprawi wydajność sieci neuronowych Androida w czasie działania. Ta funkcja dodaje zestaw nowych interfejsów API NDK do wykorzystania 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.
Interfejs Dependency API i obsługa granic synchronizacji: interfejs NNAPI 1.3 zapewnia obsługę obliczeń asynchronicznych z zależnościami, co znacznie zmniejsza obciążenie podczas wywoływania małych łańcuchowych modeli. Ta funkcja dodaje następujące nowe funkcje:
Przepływ sterowania: interfejs NNAPI 1.3 zapewnia obsługę ogólnego przepływu kontroli z wykorzystaniem nowych operacji na wykresie
ANEURALNETWORKS_IF
iANEURALNETWORKS_WHILE
, które akceptują inne modele jako argumenty przy użyciu nowego typu argumentuANEURALNETWORKS_MODEL
. Dodaliśmy też nowe funkcje:
NDK Thermal API
Gdy urządzenia za bardzo się nagrzewają, mogą ograniczać procesor lub GPU w nieoczekiwany sposób. W przypadku aplikacji i gier, które wymagają złożonej grafiki, potężnych zasobów obliczeniowych lub długotrwałej aktywności w sieci mogą wystąpić problemy.
Za pomocą interfejsu NDK Thermal API w Androidzie 11 możesz sprawdzać zmiany temperatury na urządzeniu, a następnie podejmować działania mające na celu utrzymanie mniejszego zużycia energii i chłodzenia temperatury urządzenia. Ten interfejs API jest podobny do Java Thermal API. Możesz go używać do odbierania powiadomień o zmianach stanu termicznego lub do bezpośredniego ankietowania bieżącego stanu.
Tekst i wprowadzanie
Ulepszone przejścia IME
Android 11 wprowadza nowe interfejsy API, aby usprawnić przejście w edytorach metod wprowadzania (IME), takich jak klawiatury ekranowe. Ułatwiają one dostosowywanie zawartości aplikacji do wyglądu i zniknięcia edytora IME oraz do innych elementów, takich jak paski stanu i nawigacji.
Aby wyświetlić edytor IME, gdy aktywny jest dowolny element EditText
, wywołaj view.getInsetsController().show(Type.ime())
.
Tę metodę możesz wywołać w dowolnym widoku w tej samej hierarchii, w której znajduje się zaznaczony element EditText
. Nie musisz wywoływać jej konkretnie w elemencie EditText
. Aby ukryć edytor IME, wywołaj polecenie view.getInsetsController().hide(Type.ime())
.
Aby sprawdzić, czy edytor IME jest obecnie widoczny, wykonaj polecenie view.getRootWindowInsets().isVisible(Type.ime())
.
Aby zsynchronizować widoki aplikacji z wyglądem i zniknięciem edytora IME, ustaw odbiornik w widoku, przesyłając właściwość WindowInsetsAnimation.Callback
do View.setWindowInsetsAnimationCallback()
.
(Ten detektor możesz ustawić w dowolnym widoku danych – nie musi to być EditText
). IME wywołuje metodę onPrepare()
odbiornika, a potem na początku przejścia wywołuje metodę onStart()
. Następnie wywołuje metodę onProgress()
przy każdym postępie przenoszenia. Po zakończeniu przenoszenia edytor wywołuje metodę onEnd()
.
Na każdym etapie przenoszenia możesz sprawdzić postęp przenoszenia, wywołując metodę WindowInsetsAnimation.getFraction()
.
Przykład wykorzystania tych interfejsów API znajdziesz w nowym przykładowym kodzie WindowInsetsAnimation.
Sterowanie animacją IME
Możesz też przejąć kontrolę nad animacją IME lub innym paskiem systemowym, np. paskiem nawigacyjnym. Aby to zrobić, wywołaj najpierw metodę setOnApplyWindowInsetsListener()
w celu ustawienia nowego detektora zmian w oknie:
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 przesunąć edytor IME lub inny pasek systemowy, 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
, aby używał biblioteki IUF w wersji 66, w porównaniu do wersji 63 w Androidzie 10. Nowa wersja biblioteki zawiera zaktualizowane dane regionalne CLDR i wiele ulepszeń w zakresie obsługi internacjonalizacji na 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 rozszerza zakres
FormattedValue
. - Interfejs
LocaleMatcher
API jest ulepszony o klasę kreatora, obsługę typujava.util.Locale
i klasę wyniku zawierającą dodatkowe dane o dopasowaniu. - Obecnie obsługiwane jest standard 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 danych 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()
Zmieniły się też działanie 2 metod w MediaCodec.Callback()
:
onInputBufferAvailable()
- Zamiast wywoływać z indeksem parametry
MediaCodec.getInputBuffer()
iMediaCodec.queueInputBuffer()
, aplikacje skonfigurowane pod kątem używania interfejsu Block Model API powinny używać z indeksemMediaCodec.getQueueRequest
, dołączając do boksu obiekt LinearBlock/HardwareBuffer. onOutputBufferAvailable()
- Zamiast wywoływać metodę
MediaCodec.getOutputBuffer()
z indeksem, aplikacje mogą użyć poleceniaMediaCodec.getOutputFrame()
z indeksem, aby uzyskać obiektOutputFrame
z większą ilością informacji i buforami LinearBlock/HardwareBuffer.
Dekodowanie o krótkim czasie oczekiwania w MediaCodec
Android 11 ulepsza MediaCodec
, aby umożliwić dekodowanie gier i innych aplikacji w czasie rzeczywistym z małym opóźnieniem. Możesz sprawdzić, czy kodek obsługuje dekodowanie o małym czasie oczekiwania, przekazując FEATURE_LowLatency
do MediaCodecInfo.CodecCapabilities.isFeatureSupported()
.
Aby włączyć lub wyłączyć dekodowanie o małym czasie oczekiwania, 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ąMediaCodec.setParameters()
.
Nowa funkcja AAudio AAudioStream_release()
Funkcja AAudioStream_close()
jednocześnie zwalnia i zamyka strumień audio. Może to być niebezpieczne. Jeśli inny proces spróbuje uzyskać dostęp do strumienia po tym, jak zostanie on zamknięty, spowoduje to jego awarię.
Nowa funkcja AAudioStream_release()
zwalnia strumień, ale go nie zamyka. Zasoby zostaną zwolnione
i pozostawi strumień w znanej sytuacji. Obiekt będzie utrzymywać się, dopóki nie wywołasz AAudioStream_close()
.
Interfejs API MediaParser
MediaParser to nowy interfejs API niskiego poziomu do wyodrębniania multimediów. Jest bardziej elastyczny niż narzędzie 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
korzysta z UsbManager
, aby poprosić o bezpośredni dostęp do urządzenia audio USB z obsługą przechwytywania dźwięku (np. zestawu słuchawkowego USB), pojawia się nowy komunikat ostrzegawczy z prośbą o potwierdzenie uprawnień do korzystania z urządzenia. System ignoruje wszystkie opcje „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 uniknąć takiego zachowania, aplikacja powinna prosić 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. Patrz Udostępnianie wejścia audio.
Przełącznik wyjścia
Android 11 wprowadza nowe zachowanie w aplikacjach, które korzystają z interfejsów API przesyłania i mediarouter.
Opcje przełączania są dostępne nie tylko w aplikacji, ale też w systemowym odtwarzaczu. Pomaga to zapewnić użytkownikowi płynną nawigację między urządzeniami, gdy zmienia kontekst oglądania i słuchania, np. oglądanie filmów w kuchni lub na telefonie albo słuchanie dźwięku w domu lub samochodzie. Zobacz przełącznik wyjścia.
Połączenia
Ulepszenia dostępu do Wi-Fi Passpoint
Informacje o funkcjach Passpoint dodanych w Androidzie 11 znajdziesz w artykule Passpoint.
Interfejs Wi-Fi Suggestions API jest rozwinięty
Android 11 rozwija Wi-Fi Suggestions API, aby zwiększyć możliwości zarządzania siecią przez aplikację, w tym:
- Aplikacje do zarządzania połączeniami mogą zarządzać własnymi sieciami, zezwalając na żądania rozłączenia.
- Sieci Passpoint są zintegrowane z interfejsem suggestion API i można je sugerować użytkownikowi.
- Dzięki interfejsom API Analytics możesz uzyskiwać informacje o jakości swoich sieci.
Aktualizacje usługi CallScreeningService
Począwszy od Androida 11 usługa CallScreeningService może prosić o informacje o stanie weryfikacji STIR/SHAKEN (verstat) dla połączeń przychodzących. Te informacje są częścią szczegółów połączeń w przypadku połączeń przychodzących.
Jeśli CallScreeningService
ma uprawnienie READ_CONTACTS
, aplikacja będzie powiadamiana o połączeniach przychodzących lub wychodzących z numeru zapisanego w kontaktach użytkownika.
Więcej informacji znajdziesz w artykule o zapobieganiu podszywaniu się pod ID rozmówcy.
Aktualizacje Open Mobile API
Informacje o obsłudze OMAPI w Androidzie 11 i nowszych znajdziesz w artykule Obsługa 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 poziomu 29 lub wyższym mogą stosować IKEv2/IPsec do sieci VPN zarówno w sieci VPN konfigurowanej przez użytkownika, jak i w 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 na podstawie 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
Począwszy od Androida 11 możesz za pomocą narzędzia PasspointConfiguration.getUniqueId()
uzyskać unikalny identyfikator obiektu PasspointConfiguration
, który 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ż jedną kombinację kodu kraju komórkowego (MCK) i kodu sieci komórkowej (MNC), ale ma tylko jedną pełną i jednoznaczną nazwę domeny. W Androidzie 11 i nowszych można zainstalować więcej niż 1 profil z tą samą pełną i prawidłową nazwą domeny, który będzie odpowiadał sieci co w przypadku operatora sieci domowej, gdy użytkownik instaluje kartę SIM z MCK lub MNC.
Obsługa anteny GNSS
Android 11 wprowadza klasę GnssAntennaInfo
, dzięki której aplikacja może w większym stopniu wykorzystać dokładność do centymetrów pozycjonowania, którą zapewnia globalny system nawigacji satelitarnej (GNSS).
Więcej informacji znajdziesz w przewodniku po informacjach na temat kalibracji anteny.
Grafika
Dekoder obrazów NDK
Interfejs NDK ImageDecoder
API udostępnia standardowy interfejs API dla aplikacji w języku C/C++ na Androida do bezpośredniego dekodowania obrazów. Deweloperzy aplikacji nie muszą już korzystać z interfejsów API platformy (przez JNI) ani tworzyć pakietów bibliotek do dekodowania obrazów innych firm. Więcej informacji znajdziesz w przewodniku dla programistów po dekoderze obrazów.
Interfejs Frame Rate API
Android 11 udostępnia interfejs API, który umożliwia aplikacjom informowanie systemu o planowanej liczbie klatek, co pozwala ograniczyć szumy na urządzeniach, które obsługują wiele częstotliwości odświeżania. Więcej informacji o korzystaniu z tego interfejsu API znajdziesz w przewodniku po liczbie klatek.
Wysyłanie prośby o pomoc i sprawdzanie dostępności pomocy z krótkim czasem oczekiwania
Niektóre wyświetlacze, np. niektóre wyświetlacze zewnętrzne i telewizory, mogą przetwarzać grafikę. Taka obróbka 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 nazywany również trybem gry), który zmniejsza opóźnienie przez wyłączenie tej funkcji. Więcej informacji o ALLM znajdziesz w specyfikacji HDMI 2.1.
Okno może poprosić o użycie automatycznego trybu małego opóźnienia, jeśli jest dostępny. ALLM jest szczególnie przydatny w grach i rozmowach 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ą minimalny proces przetwarzania. Aby sprawdzić, czy dany wyświetlacz ją obsługuje, wywołaj nową metodę Display.isMinimalPostProcessingSupported()
.
Wstrzykiwanie skutecznej warstwy debugowania
Aplikacje mogą teraz wczytywać zewnętrzne warstwy graficzne (GLES, Vulkan) do kodu aplikacji natywnej, aby uzyskać te same funkcje co aplikacja z możliwością debugowania, ale bez dodatkowego obciążenia wydajności. Ta funkcja jest szczególnie ważna przy profilowaniu aplikacji za pomocą narzędzi takich jak GAPID. Aby profilować aplikację, umieść w pliku manifestu aplikacji ten element meta-data, zamiast umożliwiać jej debugowanie:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Obrazy i aparat
Wycisz dźwięki powiadomień i wibracje podczas robienia zdjęć
Począwszy od Androida 11, gdy aktywnie używasz aparatu, aplikacja może wyciszać tylko wibracje, dźwięki i wibracje albo nie wyciszać ich za pomocą setCameraAudioRestriction()
.
Rozszerzona obsługa kamer w emulatorze Androida
Więcej informacji o rozszerzonej obsłudze kamer w emulatorze (od wersji Androida 11) znajdziesz w artykule Obsługa kamer.
Możliwość jednoczesnego korzystania z więcej niż jednej kamery
Android 11 dodaje interfejsy API, aby umożliwić obsługę używania więcej niż 1 aparatu naraz, m.in. przedniego i tylnego aparatu.
Aby uzyskać pomoc na urządzeniu, na którym działa Twoja aplikacja, skorzystaj z tych metod:
getConcurrentCameraIds()
zwracaSet
kombinacji identyfikatorów kamer, które mogą przesyłać strumieniowo jednocześnie z gwarantowanymi kombinacjami strumieni, jeśli zostały skonfigurowane w tym samym procesie aplikacji.isConcurrentSessionConfigurationSupported()
pyta, czy urządzenia z kamerami mogą jednocześnie obsługiwać odpowiednie konfiguracje sesji.
Lepsza obsługa obrazów HEIF z wieloma klatkami
Począwszy od Androida 11, jeśli wywołasz ImageDecoder.decodeDrawable()
i prześlesz obraz HEIF zawierający sekwencję klatek (np. animację lub zdjęcie seryjne), metoda zwróci wynik AnimatedImageDrawable
zawierający całą sekwencję obrazów. We wcześniejszych wersjach Androida metoda zwróciła BitmapDrawable
tylko 1 klatki.
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ć do dyspozycji te funkcje:
- Wyjaśnienie dla użytkownika usługi ułatwień dostępu teraz umożliwia używanie kodu HTML i obrazów nie tylko zwykłego tekstu. Dzięki tej elastyczności łatwiej wyjaśnisz użytkownikom, jak działa Twoja usługa i jak może im pomóc.
- Aby użyć opisu stanu elementu interfejsu, który ma większe znaczenie semantyczne niż
contentDescription
, wywołaj metodęgetStateDescription()
. - Aby poprosić o pomijanie systemowego eksploratora dotyku, wywołaj
setTouchExplorationPassthroughRegion()
. I podobnie, jeśli chcesz, by gesty pomijały systemowy wykrywanie gestów, wywołaj metodęsetGestureDetectionPassthroughRegion()
. - Możesz prosić o działania w IME, takie jak „Enter” czy „next”, a także o zrzuty ekranu z oknami bez flagi
FLAG_SECURE
.
Inne funkcje
Przyczyny zamknięcia procesu aplikacji
Android 11 wprowadza metodę ActivityManager.getHistoricalProcessExitReasons()
, która podaje przyczyny niedawnych zakończenia procesów. Aplikacje mogą używać tej metody do zbierania informacji diagnostycznych o awariach, np. o tym, czy zakończenie procesu jest spowodowane błędami ANR, problemami z pamięcią itp.
Poza tym nowej metody setProcessStateSummary()
możesz używać do przechowywania informacji o stanie niestandardowym na potrzeby późniejszej analizy.
Metoda getHistoricalProcessExitReasons()
zwraca wystąpienia klasy ApplicationExitInfo
, które zawierają informacje związane ze śmiercią procesu aplikacji. Wywołując getReason()
w instancji tej klasy, możesz określić, dlaczego proces aplikacji został zakończony. Na przykład wartość zwracana REASON_CRASH
oznacza, że w aplikacji wystąpił nieobsługiwany wyjątek. Jeśli aplikacja musi zapewnić unikalność zdarzeń wyjściowych, może zachować identyfikator specyficzny dla aplikacji, np. wartość skrótu na podstawie sygnatury czasowej z metody getTimestamp()
.
Dodatkowe materiały
Więcej informacji znajdziesz w artykule o nowych narzędziach na Androida 11, które zwiększają prywatność i stabilność aplikacji w wersji Medium.
Moduły ładowania zasobów
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 dają możliwość dostarczania dodatkowych zasobów lub modyfikowania 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 wczytywanie niestandardowych zasobów. Za pomocą loadFromDirectory()
możesz utworzyć ResourcesProvider
, który przekierowuje rozdzielczość zasobów i zasobów opartych na plikach, powodując, że przeszukuje określony katalog, a nie plik APK aplikacji. Dostęp do tych zasobów możesz uzyskać za pomocą rodziny open()
z klasy interfejsu API AssetManager
, podobnie jak w przypadku zasobów połączonych z plikiem APK.
Schemat podpisu pliku APK w wersji 4
Android 11 dodaje obsługę schematu podpisu pliku 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. W pliku APK nie zostaną wprowadzone żadne zmiany. Ten schemat obsługuje instalację przyrostowego pliku APK ADB, co przyspiesza instalację plików APK.
Filtry intencji dynamicznych
Aby otrzymywać intencje, podczas kompilacji musi ona zadeklarować, jakie typy danych może otrzymywać. Aby to zrobić, zdefiniuj w manifeście filtr intencji. Na Androidzie 10 i starszych aplikacjach nie można zmieniać filtrów intencji w czasie działania. To problem w przypadku aplikacji do wirtualizacji (takich jak maszyny wirtualne i Pulpity zdalne), ponieważ nie są w stanie przewidzieć, jakie dokładnie oprogramowanie zainstaluje użytkownik.
Android 11 wprowadza grupy MIME – nowy element manifestu, który umożliwia aplikacji deklarowanie dynamicznego zestawu typów MIME w filtrze intencji i modyfikowanie go automatycznie w czasie działania. Aby użyć grupy MIME, dodaj element danych do 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ść atrybutu android:mimeGroup
to identyfikator dowolnego ciągu znaków, który identyfikuje grupę MIME w czasie działania. Aby uzyskać dostęp do grupy MIME i ją aktualizować, przekazując jej identyfikator do tych nowych metod w klasie interfejsu API PackageManager
:
Gdy automatycznie dodasz typ 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 w usługach autouzupełniania.
Identyfikatory podpowiedzi w Assiststruct.ViewNode
Usługi autouzupełniania często przydają się do obliczenia skrótu podpisu dla widoku na podstawie jego właściwości. Wskazówka dotycząca widoku jest szczególnie przydatna przy obliczaniu skrótu podpisu, 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
za pomocą nowej metody getHintIdEntry()
, która zwraca identyfikator zasobu tekstu podpowiedzi dotyczącej widoku. Ta metoda zapewnia wartość niezależną od języka, której można użyć do obliczenia haszów podpisu.
Wyświetlone zdarzenia w zbiorach 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 przedstawiała zbiory danych, ale użytkownik nie wybrał żadnego z nich. W Androidzie 11 narzędzie 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ą korzystać z tych zdarzeń w połączeniu z dotychczasowym zdarzeniem TYPE_DATASET_SELECTED
, aby określać, czy użytkownik wybrał którąś z udostępnionych opcji autouzupełniania.
Integracja z IME
Klawiatury i inne edytory IME mogą teraz wyświetlać sugestie autouzupełniania bezpośrednio w tekście, na pasku sugestii lub w podobnym interfejsie zamiast w menu. W celu ochrony informacji poufnych, takich jak hasła i numery kart kredytowych, sugestie są wyświetlane użytkownikowi, ale są one niedostępne dla edytora IME, dopóki użytkownik go nie wybierze. Informacje o obsłudze tej funkcji przez edytory IME i menedżery haseł znajdziesz w artykule o integrowaniu 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. Ta funkcja ułatwia urządzeniu generowanie danych kontekstowych, takich jak wyświetlanie tytułu utworu odtwarzanego w trakcie odtwarzania w środowisku użytkownika.
Aby udostępnić dane z aplikacji usłudze przechwytywania treści, wywołaj metodę shareData()
w wystąpieniu ContentCaptureManager
. Jeśli system zaakceptuje żądanie udostępnienia danych, aplikacja otrzyma deskryptor pliku przeznaczony tylko do zapisu, który zostanie udostępniony usłudze przechwytywania treści.