Funkcje i interfejsy API – przegląd

Android 11 wprowadza nowe funkcje i interfejsy API dla deweloperów. W sekcjach poniżej znajdziesz informacje o funkcjach aplikacji i dowiesz się, jak zacząć korzystać z powiązanych interfejsów API.

Szczegółową listę nowych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie o różnicach w interfejsach API. Szczegółowe informacje o nowych interfejsach API znajdziesz w dokumentacji interfejsu API Androida. Nowe interfejsy API są wyróżnione, aby były lepiej widoczne. Aby dowiedzieć się więcej o obszarach, w których zmiany na platformie mogą mieć wpływ na Twoje aplikacje, zapoznaj się ze zmianami w zachowaniu Androida 11 w przypadku aplikacji kierowanych na Androida Rwszystkich aplikacji, a także ze zmianami dotyczącymi prywatności.

Nowe funkcje

Sterowanie urządzeniami

Android 11 zawiera nowy interfejs ControlsProviderService API, który umożliwia udostępnianie elementów sterujących podłączonym urządzeniom zewnętrznym. Te elementy sterujące są widoczne w menu zasilania Androida w sekcji Elementy sterujące urządzeniem. Więcej informacji znajdziesz w artykule Kontrolowanie urządzeń zewnętrznych.

Sterowanie multimediami

Android 11 zmienia sposób wyświetlania elementów sterujących multimediami. Elementy sterujące multimediami pojawią się w pobliżu szybkich ustawień. Sesje z różnych aplikacji są ułożone w przesuwany karuzel, który zawiera strumienie odtwarzane lokalnie na telefonie, strumienie zdalne, takie jak te wykryte na urządzeniach zewnętrznych lub sesje przesyłania, oraz poprzednie sesje, które można wznowić, w kolejności, w jakiej były ostatnio odtwarzane.

Użytkownicy mogą ponownie uruchamiać poprzednie sesje z karuzeli bez konieczności uruchamiania aplikacji. Po rozpoczęciu odtwarzania użytkownik wchodzi w interakcję z elementami sterującymi multimediami w zwykły sposób.

Więcej informacji znajdziesz w artykule o elementach sterujących multimediami.

Ekrany

Lepsza obsługa wyświetlaczy kaskadowych

Android 11 udostępnia kilka interfejsów API do obsługi wyświetlaczy typu waterfall, czyli wyświetlaczy, które owijają się wokół krawędzi urządzenia. Są one traktowane jako wariant wyświetlaczy z wycięciami. Obecne metody DisplayCutout.getSafeInset…() zwracają teraz bezpieczne wcięcie, aby uniknąć obszarów kaskadowych i wycięć. Aby renderować treści aplikacji w obszarze wodospadu:

  • Zadzwoń pod numer DisplayCutout.getWaterfallInsets(), aby poznać dokładne wymiary wkładki wodospadu.

  • Ustaw atrybut układu okna layoutInDisplayCutoutMode na LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS tak, aby okno mogło rozciągać się na obszary wycięcia i zaokrąglenia na wszystkich krawędziach ekranu. Musisz zadbać o to, aby żadne istotne treści nie znajdowały się w obszarach wycięcia ani w obszarach z efektem wodospadu.

Czujnik kąta zawiasu i urządzenia składane

Android 11 umożliwia aplikacjom działającym na urządzeniach z ekranami z zawiasami określanie kąta zawiasu. W tym celu udostępnia nowy czujnik z TYPE_HINGE_ANGLE i nowy SensorEvent, który może monitorować kąt zawiasu i podawać pomiar w stopniach między 2 integralnymi częściami urządzenia. Możesz używać tych surowych pomiarów do tworzenia szczegółowych animacji podczas manipulowania urządzeniem przez użytkownika.

Zobacz urządzenia składane.

Rozmowy

Ulepszenia w rozmowach

Android 11 wprowadza szereg ulepszeń w sposobie obsługi rozmów. Rozmowy to dwukierunkowa komunikacja w czasie rzeczywistym między co najmniej 2 osobami. Te rozmowy są specjalnie wyróżnione, a użytkownicy mają kilka nowych opcji interakcji z nimi.

Więcej informacji o rozmowach i o tym, jak Twoja aplikacja może je obsługiwać, znajdziesz w artykule Osoby i rozmowy.

Dymki czatu

Dymki są teraz dostępne dla programistów, aby ułatwić wyświetlanie rozmów w systemie. Dymki to eksperymentalna funkcja w Androidzie 10, którą można było włączyć w opcjach programisty. W Androidzie 11 nie jest to już konieczne.

Jeśli aplikacja jest kierowana na Androida 11 (poziom API 30) lub nowszego, jej powiadomienia nie są wyświetlane jako dymki, chyba że spełniają nowe wymagania dotyczące konwersacji. W szczególności powiadomienie musi być powiązane ze skrótem.

Przed Androidem 11, jeśli powiadomienie miało być wyświetlane w formie dymka, trzeba było wyraźnie określić, że ma być zawsze uruchamiane w trybie interfejsu dokumentu. Od Androida 11 nie musisz już wyraźnie ustawiać tego ustawienia. Jeśli powiadomienie jest wyświetlane w formie dymka, platforma automatycznie ustawia je tak, aby zawsze uruchamiało się w trybie interfejsu dokumentu.

Wprowadziliśmy kilka ulepszeń dotyczących wydajności dymków, a użytkownicy mają większą swobodę w zakresie włączania i wyłączania dymków w poszczególnych aplikacjach. W przypadku deweloperów, którzy wdrożyli eksperymentalną obsługę, w Androidzie 11 wprowadziliśmy kilka zmian w interfejsach API:

Wskaźniki wizualne sieci 5G

Informacje o wyświetlaniu wskaźników 5G na urządzeniach użytkowników znajdziesz w artykule Informowanie użytkowników o korzystaniu z sieci 5G.

Prywatność

Android 11 wprowadza wiele zmian i ograniczeń, które zwiększają prywatność użytkowników. Więcej informacji znajdziesz na stronie Prywatność.

Bezpieczeństwo

Aktualizacje dotyczące uwierzytelniania biometrycznego

Aby pomóc Ci kontrolować poziom bezpieczeństwa danych aplikacji, Android 11 wprowadza kilka ulepszeń w zakresie uwierzytelniania biometrycznego. Te zmiany są też widoczne w bibliotece Jetpack Biometric.

Typy uwierzytelniania

Android 11 wprowadza interfejs BiometricManager.Authenticators, którego możesz używać do deklarowania typów uwierzytelniania obsługiwanych przez Twoją aplikację.

Określanie użytego typu uwierzytelniania

Po uwierzytelnieniu użytkownika możesz sprawdzić, czy uwierzytelnienie zostało przeprowadzone za pomocą danych logowania urządzenia czy danych biometrycznych, wywołując metodę getAuthenticationType().

Dodatkowa obsługa kluczy uwierzytelniania do jednorazowego użycia

Android 11 zapewnia większą obsługę uwierzytelniania za pomocą kluczy uwierzytelniania jednorazowego.

Wycofane metody

Android 11 wycofuje te metody:

  • Metoda setDeviceCredentialAllowed().
  • Metoda setUserAuthenticationValidityDurationSeconds().
  • Przeciążona wersja funkcji canAuthenticate(), która nie przyjmuje argumentów.

Bezpieczne udostępnianie dużych zbiorów danych

W niektórych sytuacjach, np. związanych z uczeniem maszynowym lub odtwarzaniem multimediów, aplikacja może chcieć używać tego samego dużego zbioru danych co inna aplikacja. W poprzednich wersjach Androida aplikacja i inna aplikacja musiały pobrać oddzielną kopię tego samego zbioru danych.

Aby zmniejszyć nadmiarowość danych zarówno w sieci, jak i na dysku, Android 11 umożliwia buforowanie tych dużych zbiorów danych na urządzeniu za pomocą wspólnych obiektów danych. Więcej informacji o udostępnianiu zbiorów danych znajdziesz w szczegółowym przewodniku na temat udostępniania dużych zbiorów danych.

Przeprowadzanie szyfrowania opartego na plikach po ponownym uruchomieniu OTA bez danych logowania użytkownika

Po zakończeniu aktualizacji OTA i ponownym uruchomieniu urządzenia klucze szyfrowane za pomocą danych logowania (CE) umieszczone w pamięci chronionej za pomocą danych logowania są natychmiast dostępne do operacji szyfrowania opartego na plikach (FBE). Oznacza to, że po aktualizacji OTA aplikacja może wznowić działania wymagające kluczy CE, zanim użytkownik wpisze kod PIN, hasło lub narysuje wzór.

Skuteczność i jakość

Debugowanie bezprzewodowe

Android 11 obsługuje wdrażanie i debugowanie aplikacji bezprzewodowo z stacji roboczej za pomocą Android Debug Bridge (adb). Możesz na przykład wdrożyć aplikację z możliwością debugowania na wielu urządzeniach zdalnych bez fizycznego podłączania urządzenia przez USB i rozwiązywania typowych problemów z połączeniem USB, takich jak instalacja sterownika. Więcej informacji znajdziesz w artykule Uruchamianie aplikacji na urządzeniu.

Instalacja przyrostowa pliku APK za pomocą ADB

Instalowanie na urządzeniu dużych plików APK (o rozmiarze powyżej 2 GB) może zająć dużo czasu, nawet jeśli w aplikacji wprowadzono tylko niewielkie zmiany. Przyrostowa instalacja plików APK za pomocą ADB (Android Debug Bridge) przyspiesza ten proces, ponieważ instaluje wystarczającą część pliku APK, aby można było uruchomić aplikację, a pozostałe dane przesyła w tle. adb install będzie automatycznie korzystać z tej funkcji, jeśli jest ona obsługiwana przez urządzenie i masz zainstalowany najnowszy pakiet SDK Platform-Tools. Jeśli nie jest obsługiwana, domyślna metoda instalacji jest używana w trybie cichym.

Aby użyć tej funkcji, użyj tego polecenia adb. Jeśli urządzenie nie obsługuje instalacji przyrostowej, polecenie zakończy się niepowodzeniem i wyświetli szczegółowe wyjaśnienie.

adb install --incremental

Zanim uruchomisz przyrostową instalację pliku APK za pomocą ADB, musisz podpisać plik APK i utworzyć plik schematu podpisu APK w wersji 4. Aby ta funkcja działała, plik podpisu w wersji 4 musi znajdować się obok pliku APK.

Wykrywanie błędów za pomocą natywnego alokatora pamięci

GWP-ASan to funkcja natywnego alokatora pamięci, która pomaga znajdować błędy odwołania do pamięci po jej zwolnieniu (use-after-free) i przepełnienia bufora na stercie (heap-buffer-overflow). Możesz włączyć tę funkcję globalnie lub w przypadku konkretnych podprocesów aplikacji. Więcej informacji znajdziesz w przewodniku po GWP-Asan.

Neural Networks API 1.3

Android 11 rozszerza i ulepsza interfejs Neural Networks API (NNAPI).

Nowe operacje

NNAPI 1.3 wprowadza nowy typ operandu, TENSOR_QUANT8_ASYMM_SIGNED, aby obsługiwać nowy schemat kwantyzacji TensorFlow Lite.

Dodatkowo NNAPI 1.3 wprowadza te nowe operacje:

  • QUANTIZED_LSTM
  • IF
  • WHILE
  • ELU
  • HARD_SWISH
  • FILL
  • RANK

Nowe opcje ML

NNAPI 1.3 wprowadza nowe ustawienia, które pomagają w płynnym działaniu uczenia maszynowego:

NDK Thermal API

Gdy urządzenia za bardzo się nagrzeją, mogą ograniczyć działanie procesora lub GPU, co może mieć nieoczekiwany wpływ na aplikacje. Aplikacje i gry, które zawierają złożoną grafikę, wymagają intensywnych obliczeń lub ciągłej aktywności sieciowej, są bardziej narażone na problemy.

Używaj interfejsu NDK Thermal API w Androidzie 11, aby monitorować zmiany temperatury na urządzeniu, a następnie podejmować działania mające na celu utrzymanie niższego zużycia energii i niższej temperatury urządzenia. Ten interfejs API jest podobny do Java Thermal API. Możesz go używać do otrzymywania powiadomień o każdej zmianie stanu termicznego lub do bezpośredniego sprawdzania bieżącego stanu.

Tekst i dane wejściowe

Ulepszone przejścia IME

W Androidzie 11 wprowadzono nowe interfejsy API, które usprawniają przejścia w edytorach metod wprowadzania (IME), takich jak klawiatury ekranowe. Te interfejsy API ułatwiają dostosowywanie treści aplikacji w synchronizacji z pojawianiem się i znikaniem edytora IME oraz z innymi elementami, takimi jak pasek stanu i pasek nawigacyjny.

Aby wyświetlić edytor IME, gdy dowolny element EditText jest aktywny, wywołaj funkcję view.getInsetsController().show(Type.ime()). (Tę metodę możesz wywołać w dowolnym widoku w tej samej hierarchii co widok EditText, nie musisz wywoływać jej w widoku EditText). Aby ukryć IME, kliknij view.getInsetsController().hide(Type.ime()). Możesz sprawdzić, czy IME jest obecnie widoczny, wywołując metodę view.getRootWindowInsets().isVisible(Type.ime()).

Aby zsynchronizować widoki aplikacji z pojawianiem się i znikaniem edytora IME, ustaw odbiornik w widoku, podając WindowInsetsAnimation.Callback do View.setWindowInsetsAnimationCallback(). (Możesz ustawić ten odbiornik w dowolnym widoku, nie musi to być EditText). Edytor IME wywołuje metodę onPrepare() odbiornika, a następnie na początku przejścia wywołuje metodę onStart(). Następnie wywołuje funkcję onProgress() przy każdym postępie przejścia. Po zakończeniu przejścia IME wywołuje onEnd(). W dowolnym momencie przejścia możesz sprawdzić jego postęp, wywołując funkcję WindowInsetsAnimation.getFraction().

Przykład użycia tych interfejsów API znajdziesz w nowym przykładzie kodu WindowInsetsAnimation.

Sterowanie animacją IME

Możesz też przejąć kontrolę nad animacją IME lub animacją innego paska systemowego, np. paska nawigacyjnego. Aby to zrobić, najpierw wywołaj setOnApplyWindowInsetsListener() w celu ustawienia nowego odbiorcy zmian w przypadku wstawki okna:

Kotlin

rootView.setOnApplyWindowInsetsListener { rootView, windowInsets ->
    val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime())
    rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, 
                          barsIme.bottom)

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
    WindowInsets.CONSUMED
}

Java

mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() {
   @Override
   public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) {

       Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime());
       mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right,
                             barsIme.bottom);

      // We return the new WindowInsets.CONSUMED to stop the insets being
      // dispatched any further into the view hierarchy. This replaces the
      // deprecated WindowInsets.consumeSystemWindowInsets() and related
      // functions.
       return WindowInsets.CONSUMED;
   }
});

Aby przenieść IME lub inny pasek systemowy, wywołaj metodę kontrolera controlWindowInsetsAnimation():

Kotlin

view.windowInsetsController.controlWindowInsetsAnimation(
       Type.ime(),
       1000,
       LinearInterpolator(),
       cancellationSignal,
       object : WindowInsetsAnimationControlListener() {
           fun onReady(controller: WindowInsetsAnimationController,
                         types: Int) {
               // update IME inset
             controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */)
           }
       }
);

Java

mRoot.getWindowInsetsController().controlWindowInsetsAnimation(
       Type.ime(), 1000, new LinearInterpolator(), cancellationSignal,
       new WindowInsetsAnimationControlListener() {
           @Override
           public void onReady(
                   @NonNull WindowInsetsAnimationController controller,
                   int types
                   ) {
                   // update IME inset
                   controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset),
                           1f /* alpha */, 0.1 /* fraction progress */);
           }

           @Override
           public void onCancelled() {}
       });

Aktualizacje bibliotek ICU

Android 11 aktualizuje pakiet android.icu, aby używać wersji 66 biblioteki ICU, w porównaniu z wersją 63 w Androidzie 10. Nowa wersja biblioteki zawiera zaktualizowane dane lokalne CLDR i szereg ulepszeń obsługi internacjonalizacji w Androidzie.

Najważniejsze zmiany w nowych wersjach biblioteki:

  • Wiele interfejsów API formatowania obsługuje teraz nowy typ obiektu zwracanego, który rozszerza FormattedValue.
  • Interfejs LocaleMatcher API został rozbudowany o klasę konstruktora, obsługę typu java.util.Locale i klasę wyniku zawierającą dodatkowe dane o dopasowaniu.
  • Obsługiwany jest teraz standard Unicode 13.

Multimedia

Przydzielanie buforów MediaCodec

Android 11 zawiera nowe interfejsy APIMediaCodec, które zapewniają aplikacjom większą kontrolę nad przydzielaniem buforów wejściowych i wyjściowych. Dzięki temu aplikacja może wydajniej zarządzać pamięcią.

Nowe zajęcia:
Nowe metody:

Dodatkowo zmieniło się działanie 2 metod w MediaCodec.Callback():

onInputBufferAvailable()
Zamiast wywoływać funkcje MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer() z indeksem, jeśli aplikacje są skonfigurowane do korzystania z interfejsu BlockModel API, powinny używać funkcji MediaCodec.getQueueRequest z indeksem, dołączając do gniazda element LinearBlock lub HardwareBuffer.
onOutputBufferAvailable()
Zamiast wywoływać MediaCodec.getOutputBuffer() z indeksem, aplikacje mogą używać MediaCodec.getOutputFrame() z indeksem, aby uzyskać obiekt OutputFrame z większą ilością informacji i buforami LinearBlock/HardwareBuffer.

Dekodowanie z niskim opóźnieniem w MediaCodec

Android 11 został ulepszonyMediaCodec, aby obsługiwać dekodowanie z niskim opóźnieniem w przypadku gier i innych aplikacji działających w czasie rzeczywistym. Możesz sprawdzić, czy kodek obsługuje dekodowanie z niskim opóźnieniem, przekazując FEATURE_LowLatency do MediaCodecInfo.CodecCapabilities.isFeatureSupported().

Aby włączyć lub wyłączyć dekodowanie z niską latencją, wykonaj jedną z tych czynności:

Nowa funkcja AAudio AAudioStream_release()

Funkcja AAudioStream_close() zwalnia i zamyka strumień audio w tym samym czasie. Może to być niebezpieczne. Jeśli inny proces spróbuje uzyskać dostęp do strumienia po jego zamknięciu, ulegnie awarii.

Nowa funkcja AAudioStream_release() zwalnia strumień, ale go nie zamyka. Zwalnia to zasoby i pozostawia strumień w znanym stanie. Obiekt jest przechowywany do momentu wywołania funkcji AAudioStream_close().

MediaParser API

MediaParser to nowy interfejs API niskiego poziomu do wyodrębniania multimediów. Jest bardziej elastyczny niż MediaExtractor i zapewnia dodatkową kontrolę nad funkcją wyodrębniania multimediów.

Przechwytywanie dźwięku z urządzenia USB

Gdy aplikacja bez uprawnień RECORD_AUDIO używa interfejsu UsbManager, aby poprosić o bezpośredni dostęp do urządzenia audio USB z funkcją rejestrowania dźwięku (np. słuchawek USB), pojawia się nowy komunikat ostrzegawczy z prośbą o potwierdzenie uprawnień do korzystania z urządzenia. System ignoruje opcję „Zawsze używaj”, więc użytkownik musi potwierdzić ostrzeżenie i przyznać uprawnienia za każdym razem, gdy aplikacja poprosi o dostęp.

Aby tego uniknąć, aplikacja powinna prosić o uprawnienie RECORD_AUDIO.

Jednoczesny dostęp do mikrofonu

W Androidzie 11 dodaliśmy nowe metody do interfejsów API AudioRecord, MediaRecorderAAudioStream. Te metody włączają i wyłączają możliwość jednoczesnego rejestrowania obrazu niezależnie od wybranego przypadku użycia. Zobacz Udostępnianie wejścia audio.

Przełącznik wyjścia

Android 11 wprowadza nowe działanie w przypadku aplikacji, które korzystają z interfejsów API cast i mediarouter.

Oprócz dostępu do opcji przesyłania w aplikacji opcje przełączania są też widoczne w systemowym odtwarzaczu multimediów. Ułatwia to użytkownikowi płynne przechodzenie między urządzeniami, gdy zmienia kontekst oglądania i słuchania, np. ogląda film w kuchni lub na telefonie albo słucha dźwięku w domu lub w samochodzie. Zobacz przełącznik wyjścia.

Łączność

Ulepszenia Wi-Fi Passpoint

Informacje o funkcjach Passpoint dodanych w Androidzie 11 znajdziesz w artykule Passpoint.

Interfejs Wi-Fi Suggestion API jest rozwinięty.

Android 11 rozszerza interfejs Wi-Fi Suggestion API, aby zwiększyć możliwości zarządzania siecią w aplikacji, w tym:

  • Aplikacje do zarządzania łącznością mogą zarządzać własnymi sieciami, zezwalając na żądania odłączenia.
  • Sieci Passpoint są zintegrowane z interfejsem Suggestion API i mogą być sugerowane użytkownikowi.
  • Interfejsy Analytics API umożliwiają uzyskiwanie informacji o jakości sieci.

Aktualizacje CallScreeningService

Od Androida 11 usługa CallScreeningService może żądać informacji o stanie weryfikacji STIR/SHAKEN (verstat) w przypadku połączeń przychodzących. Te informacje są podawane w ramach szczegółów połączenia w przypadku połączeń przychodzących.

Jeśli aplikacja ma uprawnienie CallScreeningServiceREAD_CONTACTS, jest powiadamiana o połączeniach przychodzących z numerów w kontaktach użytkownika i połączeniach wychodzących na te numery.

Więcej informacji znajdziesz w artykule Zapobieganie podszywaniu się pod numer telefonu.

Aktualizacje Open Mobile API

Informacje o obsłudze OMAPI na urządzeniach z Androidem 11 i nowszym znajdziesz w artykule Obsługa czytnika Open Mobile API.

Wydajne sieci VPN

Aplikacje kierowane na interfejs API na poziomie 30 lub wyższym albo działające na urządzeniach wprowadzonych na rynek z interfejsem API na poziomie 29 lub wyższym mogą stosować IKEv2/IPsec w przypadku sieci VPN skonfigurowanych przez użytkownika i sieci VPN opartych na aplikacjach.

Sieci VPN działają natywnie w systemie operacyjnym, co upraszcza kod wymagany do nawiązywania połączeń VPN IKEv2/IPsec w aplikacji.

Kontrola dostępu do sieci na poziomie procesu

Informacje o włączaniu dostępu do sieci w przypadku poszczególnych procesów znajdziesz w artykule Zarządzanie wykorzystaniem sieci.

Zezwalaj na wiele zainstalowanych konfiguracji Passpoint z tym samym w pełni kwalifikowanym adresem domeny

Od Androida 11 możesz używać PasspointConfiguration.getUniqueId() do uzyskiwania unikalnego identyfikatora obiektu PasspointConfiguration, co umożliwia użytkownikom aplikacji instalowanie wielu profili z tą samą pełną i jednoznaczną nazwą domeny (FQDN).

Ta funkcja jest przydatna, gdy operator wdraża w swojej sieci więcej niż 1 kombinację kodu kraju komórki (MCC) i kodu sieci komórkowej (MNC), ale ma tylko 1 w pełni kwalifikowaną nazwę domeny. Na Androidzie 11 i nowszych można zainstalować więcej niż 1 profil z tym samym w pełni kwalifikowanym adresem domeny, który będzie pasować do sieci jako dostawca domowy, gdy użytkownik zainstaluje kartę SIM z kodem kraju lub kodem sieci komórkowej.

Obsługa anteny GNSS

Android 11 wprowadza klasę GnssAntennaInfo, która umożliwia aplikacji lepsze wykorzystanie pozycjonowania z dokładnością do centymetra, jakie może zapewnić globalny system nawigacji satelitarnej (GNSS).

Więcej informacji znajdziesz w przewodniku na temat kalibracji anteny.

Grafika

Dekoder obrazów NDK

Interfejs NDK ImageDecoder API udostępnia standardowy interfejs API dla aplikacji na Androida w językach C/C++, który umożliwia bezpośrednie dekodowanie obrazów. Deweloperzy aplikacji nie muszą już używać interfejsów API platformy (za pomocą JNI) ani dołączać bibliotek dekodowania obrazów innych firm. Więcej informacji znajdziesz w przewodniku dla programistów dotyczącym dekodera obrazów.

Interfejs Frame rate API

Android 11 udostępnia interfejs API, który umożliwia aplikacjom informowanie systemu o zamierzonej liczbie klatek na sekundę, aby zmniejszyć drgania na urządzeniach obsługujących wiele częstotliwości odświeżania. Informacje o korzystaniu z tego interfejsu API znajdziesz w przewodniku po liczbie klatek na sekundę.

Wysyłanie prośby o obsługę małych opóźnień i sprawdzanie, czy jest ona dostępna

Niektóre wyświetlacze mogą przetwarzać grafikę, np. niektóre zewnętrzne wyświetlacze i telewizory. To przetwarzanie końcowe poprawia grafikę, ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają automatyczny tryb niskiego opóźnienia (ALLM, znany też jako tryb gry), który minimalizuje opóźnienie przez wyłączenie przetwarzania końcowego. Więcej informacji o ALLM znajdziesz w specyfikacji HDMI 2.1.

Okno może poprosić o użycie automatycznego trybu niskiego opóźnienia, jeśli jest on dostępny. ALLM jest szczególnie przydatny w przypadku aplikacji takich jak gry i wideokonferencje, w których niskie opóźnienie jest ważniejsze niż najlepsza możliwa grafika.

Aby włączyć lub wyłączyć minimalne przetwarzanie końcowe, wywołaj Window.setPreferMinimalPostProcessing() lub ustaw atrybut okna preferMinimalPostProcessing na true. Nie wszystkie wyświetlacze obsługują minimalne przetwarzanie końcowe. Aby sprawdzić, czy dany wyświetlacz je obsługuje, wywołaj nową metodę Display.isMinimalPostProcessingSupported().

Wydajne wstrzykiwanie warstwy debugowania grafiki

Aplikacje mogą teraz wczytywać zewnętrzne warstwy graficzne (GLES, Vulkan) do natywnego kodu aplikacji, aby udostępniać te same funkcje co aplikacja z możliwością debugowania, ale bez obciążenia wydajności. Ta funkcja jest szczególnie ważna podczas profilowania aplikacji za pomocą narzędzi takich jak GAPID. Aby profilować aplikację, w pliku manifestu aplikacji umieść ten element meta-data zamiast ustawiać aplikację jako podlegającą debugowaniu:

<application ... >
    <meta-data android:name="com.android.graphics.injectLayers.enable"
                  android:value="true" />
</application>

Obrazy i aparat

Wyciszanie dźwięków i wibracji powiadomień podczas aktywnego nagrywania

Od Androida 11, gdy aktywnie korzystasz z aparatu, aplikacja może wyciszać tylko wibracje, zarówno dźwięki, jak i wibracje, lub żadne z nich za pomocą interfejsu setCameraAudioRestriction().

Rozszerzona obsługa aparatu w emulatorze Androida

Informacje o rozszerzonej obsłudze aparatów w emulatorze od Androida 11 znajdziesz w sekcji Obsługa aparatu.

Obsługa jednoczesnego używania więcej niż 1 kamery

Android 11 dodaje interfejsy API do sprawdzania obsługi używania więcej niż jednego aparatu naraz, w tym przedniego i tylnego.

Aby sprawdzić, czy urządzenie, na którym działa aplikacja, obsługuje tę funkcję, użyj tych metod:

  • getConcurrentCameraIds() zwraca Set kombinacji identyfikatorów kamer, które mogą przesyłać strumienie jednocześnie z gwarantowanymi kombinacjami strumieni, gdy są skonfigurowane przez ten sam proces aplikacji.
  • isConcurrentSessionConfigurationSupported() sprawdza, czy urządzenia z kamerą mogą jednocześnie obsługiwać odpowiednie konfiguracje sesji.

Lepsza obsługa obrazów HEIF z wieloma ramkami

Od Androida 11, jeśli wywołasz ImageDecoder.decodeDrawable() i przekażesz obraz HEIF zawierający sekwencję klatek (np. animację lub serię zdjęć), metoda zwróci AnimatedImageDrawable zawierający całą sekwencję obrazów. W starszych wersjach Androida ta metoda zwracała BitmapDrawable tylko jednej klatki.

Jeśli grafika HEIF zawiera wiele klatek, które nie są ułożone w sekwencję, możesz pobrać poszczególne klatki, wywołując funkcję MediaMetadataRetriever.getImageAtIndex().

Ułatwienia dostępu

Aktualizacje dla deweloperów usług ułatwień dostępu

Jeśli utworzysz niestandardową usługę ułatwień dostępu, możesz korzystać z tych funkcji w Androidzie 11:

  • Wyjaśnienie usługi ułatwień dostępu wyświetlane użytkownikowi może teraz zawierać kod HTML i obrazy, a nie tylko zwykły tekst. Dzięki tej elastyczności łatwiej jest wyjaśnić użytkownikom, czym jest Twoja usługa i jak może im pomóc.
  • Aby pracować z opisem stanu elementu interfejsu, który ma większe znaczenie semantyczne niż contentDescription, wywołaj metodę getStateDescription().
  • Aby zażądać, aby zdarzenia dotyku omijały eksplorator dotyku systemu, wywołaj setTouchExplorationPassthroughRegion(). Podobnie, aby poprosić o pominięcie detektora gestów systemu, wywołaj funkcję setGestureDetectionPassthroughRegion().
  • Możesz poprosić o wykonanie działań IME, takich jak „enter” i „dalej”, a także o zrzuty ekranu okien, które nie umożliwiają użycia flagi FLAG_SECURE.

Dodatkowe funkcje

Przyczyny zamknięcia procesu aplikacji

W Androidzie 11 wprowadzono metodę ActivityManager.getHistoricalProcessExitReasons(), która podaje przyczyny ostatnich zakończeń procesów. Aplikacje mogą używać tej metody do zbierania informacji diagnostycznych o awariach, np. czy zakończenie procesu jest spowodowane błędami ANR, problemami z pamięcią czy innymi przyczynami. Możesz też użyć nowej metody setProcessStateSummary() do przechowywania niestandardowych informacji o stanie na potrzeby późniejszej analizy.

Metoda getHistoricalProcessExitReasons() zwraca instancje klasy ApplicationExitInfo, która zawiera informacje o zakończeniu procesu aplikacji. Wywołując metodę getReason() w instancji tej klasy, możesz określić, dlaczego proces aplikacji został zakończony. Na przykład wartość zwracana REASON_CRASH wskazuje, że w aplikacji wystąpił nieobsłużony wyjątek. Jeśli aplikacja musi zapewnić niepowtarzalność zdarzeń wyjścia, może utrzymywać identyfikator specyficzny dla aplikacji, np. wartość skrótu opartą na sygnaturze czasowej z metody getTimestamp().

Dodatkowe materiały

Więcej informacji znajdziesz w artykule New Android 11 tools to make apps more private and stable (Nowe narzędzia Androida 11, które zwiększają prywatność i stabilność aplikacji) na platformie Medium.

Ładowanie zasobów

Android 11 wprowadza nowy interfejs API, który umożliwia aplikacjom dynamiczne rozszerzanie sposobu wyszukiwania i wczytywania zasobów. Nowe klasy interfejsu API ResourcesLoaderResourcesProvider odpowiadają głównie za udostępnianie nowych funkcji. Umożliwiają one dostarczanie dodatkowych zasobów i komponentów lub modyfikowanie wartości istniejących zasobów i komponentów.

ResourcesLoader to kontenery, które dostarczają obiekty ResourcesProvider do instancji Resources aplikacji. Z kolei obiekty ResourcesProvider udostępniają metody wczytywania danych zasobów z plików APK i tabel zasobów.

Jednym z głównych zastosowań tego interfejsu API jest niestandardowe wczytywanie komponentów. Możesz użyć loadFromDirectory() do utworzenia ResourcesProvider, który przekierowuje rozpoznawanie zasobów i komponentów opartych na plikach, powodując wyszukiwanie w określonym katalogu zamiast w pliku APK aplikacji. Dostęp do tych zasobów możesz uzyskać za pomocą rodziny metod open() z klasy interfejsu API AssetManager, tak jak w przypadku zasobów dołączonych do pliku APK.

Schemat podpisu plików APK w wersji 4

Android 11 obsługuje schemat podpisywania plików APK w wersji 4. Ten schemat tworzy nowy rodzaj podpisu w osobnym pliku (apk-name.apk.idsig), ale jest podobny do wersji 2 i 3. Nie wprowadzamy żadnych zmian w pliku APK. Ten schemat obsługuje przyrostową instalację pakietu APK za pomocą ADB, co przyspiesza instalację pakietu APK.

Dynamiczne filtry intencji

Aby aplikacja mogła odbierać intencje, musi w momencie kompilacji zadeklarować, jakie typy danych może odbierać, definiując filtr intencji w pliku manifestu aplikacji. W Androidzie 10 i starszych wersjach aplikacje nie mogą zmieniać filtrów intencji w czasie działania. Jest to problem w przypadku aplikacji do wirtualizacji (takich jak maszyny wirtualne i zdalne pulpity), ponieważ nie mają one możliwości dokładnego określenia, jakie oprogramowanie użytkownik zainstaluje w ich wnętrzu.

Android 11 wprowadza grupy MIME, czyli nowy element manifestu, który umożliwia aplikacji deklarowanie dynamicznego zestawu typów MIME w filtrze intencji i modyfikowanie go programowo w czasie działania. Aby użyć grupy MIME, w pliku manifestu aplikacji umieść element danych z nowym atrybutem android:mimeGroup:

<intent-filter>
  <action android:name="android.intent.action.SEND"/>
  <category android:name="android.intent.category.DEFAULT"/>
  <data android:mimeGroup="myMimeGroup"/>
</intent-filter>

Wartość atrybutu android:mimeGroup to dowolny ciąg znaków, który identyfikuje grupę MIME w czasie działania. Możesz uzyskać dostęp do zawartości grupy MIME i ją aktualizować, przekazując jej identyfikator do tych nowych metod w klasie interfejsu API PackageManager:

Gdy dodasz typ MIME do grupy MIME programowo, będzie on działać dokładnie tak samo jak statyczny typ MIME zadeklarowany w pliku manifestu.

bez wzajemnego zakłócania działania.

Ulepszenia autouzupełniania

Android 11 wprowadza ulepszenia usług autouzupełniania.

Identyfikatory wskazówek w klasie AssistStructure.ViewNode

Usługi autouzupełniania często obliczają hash podpisu widoku na podstawie jego właściwości. Wskazówka dotycząca widoku to szczególnie przydatna właściwość do uwzględnienia podczas obliczania skrótu podpisu, ale ciąg wskazówki może się zmieniać w zależności od ustawień regionalnych telefonu. Aby rozwiązać ten problem, Android 11 rozszerza AssistStructure.ViewNode o nową metodę getHintIdEntry(), która zwraca identyfikator zasobu tekstu podpowiedzi widoku. Ta metoda zwraca wartość niezależną od ustawień regionalnych, której możesz użyć do obliczenia skrótów podpisu.

Zdarzenia wyświetlania zbiorów danych

Aby pomóc usługom autouzupełniania w ulepszaniu sugestii, Android 11 umożliwia identyfikowanie przypadków, w których usługa autouzupełniania wyświetliła zbiory danych, ale użytkownik nie wybrał żadnego z nich. W Androidzie 11 FillEventHistory zgłasza nowy TYPE_DATASETS_SHOWN typ zdarzenia. FillEventHistory rejestruje zdarzenie tego typu za każdym razem, gdy usługa autouzupełniania prezentuje użytkownikowi co najmniej 1 zestaw danych. Usługi autouzupełniania mogą używać tych zdarzeń w połączeniu z dotychczasowym zdarzeniem TYPE_DATASET_SELECTED, aby określić, czy użytkownik wybrał którąś z udostępnionych opcji autouzupełniania.

Integracja z edytorem IME

Klawiatury i inne edytory IME mogą teraz wyświetlać sugestie autouzupełniania w linii, na pasku sugestii lub w podobnym interfejsie, a nie w menu. Aby chronić informacje poufne, takie jak hasła i numery kart kredytowych, sugestie są wyświetlane użytkownikowi, ale nie są znane IME, dopóki użytkownik nie wybierze jednej z nich. Informacje o tym, jak edytory IME i menedżery haseł mogą obsługiwać tę funkcję, znajdziesz w artykule Integracja autouzupełniania z klawiaturami.

Udostępnianie danych usłudze przechwytywania treści

Od Androida 11 aplikacja może udostępniać dane usłudze przechwytywania treści na urządzeniu. Dzięki temu urządzenie może łatwiej dostarczać informacje kontekstowe, np. wyświetlać nazwę utworu, który jest aktualnie odtwarzany w otoczeniu użytkownika.

Aby udostępnić dane z aplikacji usłudze przechwytywania treści, wywołaj metodę shareData() na instancji ContentCaptureManager. Jeśli system zaakceptuje prośbę o udostępnianie danych, aplikacja otrzyma deskryptor pliku tylko do zapisu, który może udostępnić usłudze przechwytywania treści.