Funkcje i interfejsy API – przegląd

Android 11 wprowadza nowe, świetne 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 różnic w interfejsie API. Szczegółowe informacje o nowych interfejsach API znajdziesz w dokumentacji API Androida – 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 w przypadku aplikacji kierowanych na Androida R i wszystkich aplikacji, a także ze zmianami dotyczącymi prywatności.

Nowe funkcje

Sterowanie urządzeniami

Android 11 zawiera nowy interfejs API ControlsProviderService, który umożliwia udostępnianie elementów sterujących połączonymi urządzeniami zewnętrznymi. Te elementy sterujące pojawiają się w sekcji Sterowanie urządzeniami w menu zasilania Androida. Więcej informacji znajdziesz w artykule Kontrolowanie urządzeń zewnętrznych.

Obsługa mediów

Android 11 zmienia sposób wyświetlania opcji sterowania multimediami. Opcje sterowania multimediami pojawiają się obok Szybkich ustawień. Sesje z wielu aplikacji są ułożone w karuzeli, którą można przewijać. Obejmuje ona strumienie odtwarzane lokalnie na telefonie, strumienie zdalne, np. 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 może korzystać z opcji sterowania multimediami w zwykły sposób.

Więcej informacji znajdziesz w artykule o opcjach sterowania multimediami.

Ekrany

Lepsza obsługa wyświetlaczy kaskadowych

Android 11 udostępnia kilka interfejsów API do obsługi wyświetlaczy wodospadowych, które zachodzą na krawędzie urządzenia. Takie wyświetlacze są traktowane jako wariant wyświetlaczy z wycięciami w ekranie. Istniejące metody DisplayCutout.getSafeInset…() zwracają teraz bezpieczną ramkę, aby uniknąć obszarów wodospadu i wycięć. Aby renderować zawartość aplikacji w obszarze wodospadu:

  • Wywołaj DisplayCutout.getWaterfallInsets(), aby uzyskać dokładne wymiary wcięcia kaskadowego.

  • Ustaw atrybut układu okna layoutInDisplayCutoutMode na LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS, aby umożliwić rozszerzenie okna na obszary wycięcia i wodospadu na wszystkich krawędziach ekranu. Upewnij się, że w obszarze wycięcia ani wodospadu 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 zawiasem określenie kąta zawiasu dzięki nowemu czujnikowi TYPE_HINGE_ANGLE i nowemu 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 nieprzetworzonych pomiarów do tworzenia szczegółowych animacji, gdy użytkownik manipuluje urządzeniem.

Zobacz Urządzenia składane.

Rozmowy

Ulepszenia rozmów

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ą szczególnie wyróżnione, a użytkownicy mają 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ą już dostępne dla deweloperów, aby ułatwić wyświetlanie rozmów w systemie. Dymki były eksperymentalną funkcją 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 (API na poziomie 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.

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

Wprowadziliśmy szereg ulepszeń dotyczących wydajności dymków, a użytkownicy mają większą elastyczność 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 interfejsach API w Androidzie 11 wprowadziliśmy kilka zmian:

Wskaźniki wizualne 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 5G.

Prywatność

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

Bezpieczeństwo

Aktualizacje uwierzytelniania biometrycznego

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

Typy uwierzytelniania

Android 11 wprowadza interfejs BiometricManager.Authenticators, za pomocą którego możesz zadeklarować typy uwierzytelniania obsługiwane przez aplikację.

Określanie użytego typu uwierzytelniania

Po uwierzytelnieniu użytkownika możesz sprawdzić, czy uwierzytelnienie nastąpiło przy użyciu danych logowania urządzenia czy danych biometrycznych, wywołując funkcję getAuthenticationType().

Dodatkowa obsługa kluczy uwierzytelniania przy każdym użyciu

Android 11 zapewnia lepszą obsługę uwierzytelniania za pomocą kluczy uwierzytelniania przy każdym użyciu.

Wycofane metody

W Androidzie 11 wycofano 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 każda aplikacja musiała pobrać osobną kopię tego samego zbioru danych.

Aby zmniejszyć nadmiarowość danych zarówno w sieci, jak i na dysku, Android 11 umożliwia przechowywanie tych dużych zbiorów danych w pamięci podręcznej na urządzeniu przy użyciu udostępnionych obiektów blob danych. Więcej informacji o udostępnianiu zbiorów danych znajdziesz w szczegółowym przewodniku po udostępnianiu dużych zbiorów danych.

Szyfrowanie oparte na plikach po ponownym uruchomieniu OTA bez danych logowania użytkownika

Gdy urządzenie zakończy aktualizację OTA i uruchomi się ponownie, klucze Credential Encrypted (CE) umieszczone w pamięci chronionej danymi logowania są natychmiast dostępne do operacji szyfrowania opartego na plikach (FBE). Oznacza to, że po aktualizacji OTA aplikacja może wznowić operacje wymagające kluczy CE, zanim użytkownik wpisze kod PIN, wzór lub hasło.

Wydajność i jakość

Debugowanie bezprzewodowe

Android 11 obsługuje bezprzewodowe wdrażanie i debugowanie aplikacji ze stacji roboczej za pomocą narzędzia 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 sterowników. Więcej informacji znajdziesz w artykule Uruchamianie aplikacji na urządzeniu.

Przyrostowa instalacja pliku APK za pomocą ADB

Instalowanie dużych (ponad 2 GB) plików APK na urządzeniu może zająć dużo czasu, nawet jeśli w aplikacji wprowadzono tylko niewielką zmianę. Przyrostowa instalacja plików APK za pomocą ADB (Android Debug Bridge) przyspiesza ten proces, instalując wystarczającą część pliku APK, aby uruchomić aplikację, i przesyłając pozostałe dane w tle. adb install będzie automatycznie korzystać z tej funkcji, jeśli jest ona obsługiwana przez urządzenie i masz zainstalowane najnowsze narzędzia platformy SDK. Jeśli nie jest obsługiwana, domyślna metoda instalacji jest używana bez powiadomienia.

Aby korzystać z tej funkcji, użyj tego polecenia adb. Jeśli urządzenie nie obsługuje instalacji przyrostowej, polecenie nie powiedzie się i zostanie wyświetlone szczegółowe wyjaśnienie.

adb install --incremental

Przed uruchomieniem przyrostowej instalacji pliku APK za pomocą ADB musisz podpisać plik APK i utworzyć plik schematu podpisywania plików 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 znaleźć 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 dla 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, który obsługuje nowy schemat kwantyzacji TensorFlow Lite.

Dodatkowo NNAPI 1.3 wprowadza te nowe operacje:

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

Nowe ustawienia ML

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

NDK Thermal API

Gdy urządzenia się przegrzewają, mogą ograniczać działanie procesora lub GPU, co może mieć nieoczekiwany wpływ na aplikacje. Aplikacje lub 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żyj interfejsu NDK Thermal API w Androidzie 11, aby monitorować zmiany temperatury urządzenia, 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 otrzymywania powiadomień o zmianie stanu temperatury lub do bezpośredniego sprawdzania bieżącego stanu.

Tekst i dane wejściowe

Ulepszone przejścia IME

Android 11 wprowadza nowe interfejsy API, które ulepszają 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 znika niem edytora IME oraz z innymi elementami, takimi jak paski stanu i nawigacji.

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

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

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

Sterowanie animacją IME

Możesz też przejąć kontrolę nad animacją edytora IME lub animacją innego paska systemowego, np. paska nawigacyjnego. Aby to zrobić, najpierw wywołaj setOnApplyWindowInsetsListener(), aby ustawić nowy obiekt nasłuchujący zmian 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ę 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

W Androidzie 11 pakiet android.icu został zaktualizowany do wersji 66 biblioteki ICU (w Androidzie 10 była to wersja 63). Nowa wersja biblioteki zawiera zaktualizowane dane regionalne CLDR oraz szereg ulepszeń obsługi internacjonalizacji w Androidzie.

Najważniejsze zmiany w nowych wersjach biblioteki:

  • Wiele interfejsów API do formatowania obsługuje teraz nowy typ obiektu zwracanego, który rozszerza FormattedValue.
  • Interfejs API LocaleMatcher został ulepszony o klasę kreatora, obsługę typu java.util.Locale i klasę wyniku z dodatkowymi danymi o dopasowaniu.
  • Dodaliśmy obsługę standardu 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:

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

onInputBufferAvailable()
Zamiast wywoływać MediaCodec.getInputBuffer() i MediaCodec.queueInputBuffer() z indeksem, aplikacje skonfigurowane do korzystania z interfejsu Block Model API powinny używać MediaCodec.getQueueRequest z indeksem, dołączając LinearBlock/HardwareBuffer do gniazda.
onOutputBufferAvailable()
Zamiast wywoływać MediaCodec.getOutputBuffer() z indeksem, aplikacje mogą używać MediaCodec.getOutputFrame() z indeksem, aby uzyskać obiekt OutputFrame z dodatkowymi informacjami i buforami LinearBlock/HardwareBuffer.

Dekodowanie z małym opóźnieniem w MediaCodec

Android 11 ulepsza MediaCodec, aby obsługiwać dekodowanie z niskim opóźnieniem w grach i innych aplikacjach 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 małym opóźnieniem, wykonaj jedną z tych czynności:

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 jego zamknięciu, proces ulegnie awarii.

Nowa funkcja AAudioStream_release() zwalnia strumień, ale go nie zamyka. Spowoduje to zwolnienie zasobów i pozostawienie strumienia w znanym stanie. Obiekt będzie istnieć, dopóki nie wywołasz metody 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 funkcjami wyodrębniania multimediów.

Przechwytywanie dźwięku z urządzenia USB

Gdy aplikacja bez uprawnienia RECORD_AUDIO używa UsbManager, aby poprosić o bezpośredni dostęp do urządzenia audio USB z możliwością przechwytywania dźwięku (np. zestawu słuchawkowego USB), pojawia 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 potwierdzić ostrzeżenie i przyznać uprawnienia za każdym razem, gdy aplikacja prosi o dostęp.

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

Jednoczesny 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 działanie aplikacji, które korzystają z interfejsów API Cast i MediaRouter.

Oprócz opcji przesyłania dostępnych w aplikacji opcje przełączania pojawiają się też w systemowym odtwarzaczu multimedialnym. Dzięki temu użytkownik może płynnie przechodzić między urządzeniami, gdy zmienia się kontekst oglądania i słuchania, np. oglądanie filmu w kuchni lub na telefonie albo słuchanie dźwięku w domu lub w samochodzie. Zobacz przełącznik wyjścia.

Połączenia

Ulepszenia Wi-Fi Passpoint

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

Interfejs Wi-Fi Suggestion API został rozszerzony

Android 11 rozszerza interfejs Wi-Fi Suggestion 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 prośby o rozłączenie.
  • Sieci Passpoint są zintegrowane z interfejsem Suggestion API i mogą być sugerowane użytkownikowi.
  • Interfejsy API Analytics 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 szczegółach połączenia w przypadku połączeń przychodzących.

Jeśli CallScreeningService ma uprawnienie READ_CONTACTS, aplikacja jest powiadamiana o połączeniach przychodzących z numeru zapisanego w kontaktach użytkownika lub o połączeniach wychodzących na taki numer.

Więcej informacji znajdziesz w artykule Zapobieganie fałszowaniu identyfikatora rozmówcy.

Aktualizacje Open Mobile API

Informacje o obsłudze OMAPI na Androidzie 11 i nowszych znajdziesz w artykule o obsłudze 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 z interfejsem API na poziomie 29 lub wyższym mogą stosować IKEv2/IPsec do sieci VPN skonfigurowanych przez użytkownika i opartych na aplikacji.

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 poziomie procesu znajdziesz w artykule Zarządzanie wykorzystaniem sieci.

Zezwalaj na wiele zainstalowanych konfiguracji Passpoint z tą samą nazwą FQDN

Od Androida 11 możesz używać PasspointConfiguration.getUniqueId(), aby 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 MCC (Mobile Country Code) i kodu MNC (Mobile Network Code), ale ma tylko jedną nazwę FQDN. Na urządzeniach z Androidem 11 lub nowszym można zainstalować więcej niż 1 profil z tą samą nazwą FQDN, która będzie pasować do sieci jako dostawca domowy, gdy użytkownik zainstaluje kartę SIM z kodem MCC lub MNC.

Obsługa anteny GNSS

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

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

Grafika

Dekoder obrazów NDK

Interfejs API NDK ImageDecoder 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 (za pomocą JNI) ani dołączać bibliotek innych firm do dekodowania obrazów. Więcej informacji znajdziesz w przewodniku dla programistów dotyczącym dekodera 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ć drgania na urządzeniach obsługujących różne częstotliwości odświeżania. Informacje o tym, jak korzystać z tego interfejsu API, znajdziesz w przewodniku po liczbie klatek.

Wysyłanie prośby o obsługę niskiego opóźnienia i sprawdzanie jej dostępności

Niektóre wyświetlacze, np. niektóre wyświetlacze zewnętrzne i telewizory, mogą wykonywać post-processing grafiki. To przetwarzanie końcowe poprawia grafikę, ale może zwiększyć opóźnienie. Nowsze wyświetlacze, które obsługują HDMI 2.1, mają tryb automatycznego 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 żądać użycia trybu automatycznego niskiego opóźnienia, jeśli jest on dostępny. Tryb ALLM jest szczególnie przydatny w przypadku aplikacji takich jak gry i rozmowy wideo, gdzie 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 preferMinimalPostProcessing okna na true. Nie wszystkie wyświetlacze obsługują minimalne przetwarzanie końcowe. Aby dowiedzieć się, czy dany wyświetlacz obsługuje tę funkcję, wywołaj nową metodę Display.isMinimalPostProcessingSupported().

Wstrzykiwanie warstwy debugowania grafiki o wysokiej wydajności

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

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

Obrazy i aparat

Wycisz dźwięki i wibracje powiadomień podczas aktywnego nagrywania

Począwszy od Androida 11, podczas aktywnego korzystania z aparatu aplikacja może wyciszać tylko wibracje, zarówno dźwięki, jak i wibracje, lub żadne z nich, używając setCameraAudioRestriction().

Rozszerzona obsługa aparatu w emulatorze Androida

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

obsługa jednoczesnego korzystania z więcej niż 1 kamery,

Android 11 dodaje interfejsy API do obsługi zapytań dotyczących korzystania z więcej niż 1 aparatu naraz, w tym 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 aparatów, które mogą przesyłać strumieniowo jednocześnie, z gwarantowanymi kombinacjami strumieni, gdy są skonfigurowane przez ten sam proces aplikacji.
  • isConcurrentSessionConfigurationSupported() sprawdza, czy urządzenia z aparatem mogą jednocześnie obsługiwać odpowiednie konfiguracje sesji.

Lepsza obsługa zdjęć HEIF z wieloma klatkami

Jeśli w Androidzie 11 lub nowszym wywołasz metodę ImageDecoder.decodeDrawable() i przekażesz obraz HEIF zawierający sekwencję klatek (np. animację lub zdjęcie seryjne), metoda zwróci obiekt AnimatedImageDrawable zawierający całą sekwencję obrazów. W starszych wersjach Androida metoda zwracała BitmapDrawable tylko jednej klatki.

Jeśli grafika HEIF zawiera wiele klatek, które nie są w sekwencji, możesz pobrać pojedynczą klatkę, wywołując metodę 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, w Androidzie 11 możesz korzystać z tych funkcji:

  • Wyjaśnienie dotyczące usługi ułatwień dostępu dla użytkownika może teraz zawierać kod HTML i obrazy, a nie tylko zwykły tekst. Ta elastyczność ułatwia wyjaśnienie użytkownikom, do czego służy Twoja usługa i jak może im pomóc.
  • Aby pracować z opisem stanu elementu interfejsu, który jest bardziej znaczący semantycznie niż contentDescription, wywołaj metodę getStateDescription().
  • Aby poprosić o pominięcie eksploratora dotykowego systemu przez zdarzenia dotknięcia, wywołaj setTouchExplorationPassthroughRegion(). Podobnie, aby poprosić o pominięcie detektora gestów systemu, wywołaj setGestureDetectionPassthroughRegion().
  • Możesz poprosić o działania IME, takie jak „enter” i „dalej”, a także o zrzuty ekranu okien, które nie mają włączonej flagi FLAG_SECURE.

Dodatkowe funkcje

Powody zakończenia procesu aplikacji

W Androidzie 11 wprowadziliśmy metodę ActivityManager.getHistoricalProcessExitReasons(), która podaje przyczyny niedawnego zakończenia procesów. Aplikacje mogą używać tej metody do zbierania informacji diagnostycznych o awariach, takich jak informacje o tym, czy zakończenie procesu jest spowodowane błędami ANR, problemami z pamięcią czy innymi przyczynami. Możesz też użyć nowej metody setProcessStateSummary(), aby zapisać informacje o stanie niestandardowym do późniejszej analizy.

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

Dodatkowe materiały

Więcej informacji znajdziesz w artykule na temat nowych narzędzi na Androida 11, które zwiększają prywatność i stabilność aplikacji, opublikowanym na platformie Medium.

Moduły wczytywania zasobów

Android 11 wprowadza nowy interfejs API, który umożliwia aplikacjom dynamiczne rozszerzanie sposobu wyszukiwania i ładowania zasobów. Nowe klasy interfejsu API ResourcesLoader i ResourcesProvider odpowiadają głównie za udostępnianie nowych funkcji. Razem umożliwiają dostarczanie dodatkowych zasobów i komponentów lub modyfikowanie wartości istniejących zasobów i komponentó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 zastosowań tego interfejsu API jest wczytywanie komponentów niestandardowych. Możesz użyć loadFromDirectory(), aby utworzyć ResourcesProvider, który przekierowuje rozpoznawanie zasobów i komponentów opartych na plikach, powodując wyszukiwanie w określonym katalogu, a nie w pliku APK aplikacji. Dostęp do tych zasobów możesz uzyskać za pomocą metod z rodziny open() z klasy interfejsu API AssetManager, tak samo jak w przypadku zasobów dołączonych do pakietu APK.

Schemat podpisywania plików APK w wersji 4

Android 11 obsługuje schemat podpisywania plików APK w wersji 4. Ten schemat generuje nowy rodzaj podpisu w osobnym pliku (apk-name.apk.idsig), ale poza tym jest podobny do wersji 2 i 3. W pliku APK nie zostaną wprowadzone żadne zmiany. Ten schemat obsługuje przyrostową instalację pakietu APK przez ADB, co przyspiesza instalację pakietu APK.

Dynamiczne filtry intencji

Aby otrzymywać intencje, aplikacja musi w czasie kompilowania zadeklarować, jakie typy danych może odbierać. W tym celu musi zdefiniować filtr intencji w manifeście aplikacji. W Androidzie 10 i starszych aplikacje nie mogą zmieniać filtrów intencji w czasie działania. Jest to problem w przypadku aplikacji do wirtualizacji (takich jak maszyny wirtualne i pulpity zdalne), ponieważ nie mają one możliwości dokładnego określenia, jakie oprogramowanie użytkownik zainstaluje w ich środowisku.

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

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

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

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

Ulepszenia autouzupełniania

Android 11 wprowadza ulepszenia usług autouzupełniania.

Identyfikatory wskazówek w AssistStructure.ViewNode

Usługi autouzupełniania często obliczają skrót podpisu widoku na podstawie jego właściwości. Wskazówka dotycząca widoku jest szczególnie przydatną właściwością, którą warto uwzględnić 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, w Androidzie 11 rozszerzono klasę AssistStructure.ViewNode o nową metodę getHintIdEntry(), która zwraca identyfikator zasobu tekstu podpowiedzi widoku. Ta metoda zwraca wartość niezależną od języka, której można użyć do obliczenia skrótów podpisu.

Zdarzenia wyświetlenia zbiorów danych

Aby pomóc usługom autouzupełniania ulepszać sugestie, 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 raportuje nowy typ zdarzenia TYPE_DATASETS_SHOWN. FillEventHistory rejestruje zdarzenie tego typu, gdy usługa autouzupełniania wyświetla użytkownikowi co najmniej 1 zbiór danych. Usługi autouzupełniania mogą używać tych zdarzeń w połączeniu z istniejącym zdarzeniem TYPE_DATASET_SELECTED, aby określić, czy użytkownik wybrał którąś z podanych opcji autouzupełniania.

Integracja z edytorem IME

Klawiatury i inne edytory IME mogą teraz wyświetlać sugestie autouzupełniania w tekście, na pasku podpowiedzi 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 edytorowi 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. Ta funkcja ułatwia urządzeniu dostarczanie informacji kontekstowych, takich jak nazwa 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() w instancji ContentCaptureManager. Jeśli system zaakceptuje prośbę o udostępnienie danych, aplikacja otrzyma deskryptor pliku tylko do zapisu, który będzie można udostępnić usłudze przechwytywania treści.