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 powiązanych z nimi interfejsach API.

Szczegółową listę nowych, zmodyfikowanych i usuniętych interfejsów API znajdziesz w raporcie porównawczym interfejsów API. Szczegółowe informacje o nowych interfejsach API znajdziesz w dokumentacji interfejsu API Androida – nowe interfejsy API są wyróżnione. Aby dowiedzieć się więcej o obszarach, w których zmiany w platformie mogą mieć wpływ na Twoje aplikacje, zapoznaj się ze zmianami zachowania 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 API ControlsProviderService, którego możesz używać do udostępniania elementów sterujących dla podłączonych urządzeń zewnętrznych. Te opcje są widoczne w sekcji Ustawienia urządzenia w menu zasilania Androida. Więcej informacji znajdziesz w artykule Kontrolowanie urządzeń zewnętrznych.

Sterowanie multimediami

Android 11 zmienia sposób wyświetlania elementów sterujących multimediami. Elementy sterujące multimediami są widoczne w pobliżu szybkich ustawień. Sesje z wielu aplikacji są uporządkowane w karuzeli, którą można przewijać. Obejmuje ona strumienie odtwarzane lokalnie na telefonie, strumienie zdalne, takie jak te wykryte na urządzeniach zewnętrznych lub sesje przesyłania, a także poprzednie sesje, które można wznowić, w kolejności ich ostatniego odtwarzania.

Użytkownicy mogą ponownie uruchomić poprzednie sesje z karuzeli bez konieczności uruchamiania aplikacji. Po rozpoczęciu odtwarzania użytkownik może sterować odtwarzaniem w zwykły sposób.

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

Ekrany

Lepsza obsługa wyświetlania kaskadowych

Android 11 udostępnia kilka interfejsów API do obsługi wyświetlaczy kaskadowych, czyli wyświetlaczy, które otaczają krawędź urządzenia. Takie wyświetlacze są traktowane jako wariant wyświetlaczy z wycięciami. Dotychczasowe metody DisplayCutout.getSafeInset…()zwracają teraz bezpieczny wkład, aby uniknąć obszarów kaskadowych i wycięć. Aby wyrenderować treści aplikacji w obszarze osi czasu:

  • Aby uzyskać dokładne wymiary wstawki kaskady, zadzwoń pod numer DisplayCutout.getWaterfallInsets().

  • Ustaw atrybut układu okna layoutInDisplayCutoutMode na LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS, aby okno rozszerzało się na obszar wycięcia i kaskady na wszystkich krawędziach ekranu. Upewnij się, że w strefach wycinania lub kaskady nie ma żadnych istotnych treści.

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

Android 11 umożliwia aplikacjom działającym na urządzeniach z konfiguracjami ekranu opartymi na zawiasach określanie kąta zawiasu za pomocą nowego czujnika z TYPE_HINGE_ANGLE i nowego SensorEvent, który może monitorować kąt zawiasu i podawać pomiar w stopniach między dwoma integralnymi częściami urządzenia. Możesz używać tych surowych pomiarów do wykonywania szczegółowych animacji podczas manipulowania urządzeniem przez użytkownika.

Zobacz złóżanki.

Rozmowy

Ulepszenia rozmów

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

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

Dymki czatu

Dymki są teraz dostępne dla programistów, aby ułatwiać wyświetlanie rozmów w całym systemie. W Androidzie 10 bańki były funkcją eksperymentalną, którą można było włączyć w opcjach dla deweloperów. W Androidzie 11 nie jest to już konieczne.

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

Przed Androidem 11, jeśli chciałeś wyświetlić powiadomienie w bańce, musiałeś wyraźnie określić, że powiadomienie ma być zawsze uruchamiane w trybie interfejsu dokumentu. Od Androida 11 nie musisz już ręcznie ustawiać tego ustawienia. Jeśli powiadomienie jest w formie bąbelka, platforma automatycznie skonfiguruje powiadomienie tak, aby zawsze uruchamiać je w interfejsie dokumentu.

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

Wskaźniki wizualne 5G

Informacje o wyświetlaniu wskaźników 5G na urządzeniach użytkowników znajdziesz w artykule Poinformowanie użytkowników o tym, że korzystają z 5G.

Prywatność

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

Bezpieczeństwo

Aktualizacje uwierzytelniania biometrycznego

Aby pomóc Ci kontrolować poziom zabezpieczeń danych aplikacji, Android 11 wprowadza kilka ulepszeń uwierzytelniania biometrycznego. Te zmiany pojawią się też w bibliotece funkcji biometrycznej Jetpacka.

Typy uwierzytelniania

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

Określanie typu uwierzytelniania

Po uwierzytelnieniu użytkownika możesz sprawdzić, czy uwierzytelnił się on za pomocą danych logowania na urządzeniu lub danych biometrycznych, wywołując funkcję getAuthenticationType().

Dodatkowa obsługa kluczy uwierzytelniania na potrzeby poszczególnych zastosowań

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

Wycofane metody

W Androidzie 11 wycofane zostały te metody:

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

Bezpieczne udostępnianie dużych zbiorów danych

W niektórych sytuacjach, np. gdy korzystasz z systemów uczących się lub odtwarzania multimediów, Twoja aplikacja może chcieć używać tego samego dużego zbioru danych co inna aplikacja. W poprzednich wersjach Androida Twoja aplikacja i inna aplikacja musiały pobierać osobne kopie tego samego zbioru danych.

Aby zmniejszyć redundancję danych, zarówno w sieci, jak i na dysku, Android 11 umożliwia przechowywanie w pamięci podręcznej dużych zbiorów danych za pomocą elementów danych współdzielonych. Więcej informacji o udostępnianiu zbiorów danych znajdziesz w szczegółowym przewodniku na temat udostępniania dużych zbiorów danych.

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

Po zakończeniu aktualizacji OTA i ponownym uruchomieniu urządzenia klucze szyfrowania danych logowania (CE) umieszczone w miejscu pamięci chronionym przez dane logowania są natychmiast dostępne do operacji szyfrowania opartego na plikach (FBE). Oznacza to, że po aktualizacji OTA Twoja aplikacja może wznowić działanie, które wymaga kluczy CE, zanim użytkownik wpisze kod PIN, wzór lub hasło.

Skuteczność i jakość

Debugowanie bezprzewodowe

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

Instalacja przyrostowa pliku APK za pomocą ADB

Instalowanie dużych plików APK (powyżej 2 GB) na urządzeniu może zająć dużo czasu, nawet jeśli w aplikacji wprowadzono tylko niewielką zmianę. Instalacja przyrostowa pliku APK za pomocą ADB (Android Debug Bridge) przyspiesza ten proces, instalując tyle pliku APK, aby można było uruchomić aplikację, a pozostałe dane są przesyłane strumieniowo w tle. adb install automatycznie użyje tej funkcji, jeśli jest ona obsługiwana przez urządzenie i masz zainstalowaną najnowszą wersję pakietu SDK Platform-Tools. Jeśli nie jest obsługiwana, używana jest domyślna metoda instalacji.

Aby korzystać z tej funkcji, użyj tego polecenia adb. Jeśli urządzenie nie obsługuje instalacji przyrostowej, polecenie kończy się niepowodzeniem i wyświetla obszerne wyjaśnienie.

adb install --incremental

Przed uruchomieniem ADB do stopniowego instalowania plików APK musisz podpisać plik APK i utworzyć plik z schematem podpisu APK w wersji 4. Aby ta funkcja działała, plik podpisu w wersji 4 musi znajdować się obok pliku APK.

wykrywanie błędów za pomocą natywnego sterownika pamięci;

GWP-ASan to funkcja natywnej alokacji pamięci, która pomaga znajdować błędy związane z odwołaniem do pamięci po jej zwolnieniu (use-after-free) i przepełnieniami bufora na stercie (heap-buffer-overflow). Możesz włączyć tę funkcję globalnie lub w przypadku określonych podprocesów aplikacji. Więcej informacji znajdziesz w przewodniku GWP-Asan.

Neural Networks API 1.3

Android 11 rozszerza i ulepsza interfejs API sieci neuronowych (NNAPI).

Nowe operacje

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

Dodatkowo w NNAPI 1.3 wprowadzono te nowe operacje:

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

Nowe opcje sterowania systemami uczących się

NNAPI 1.3 wprowadza nowe ustawienia, które ułatwiają prawidłowe działanie systemów uczących się:

NDK Thermal API

Gdy urządzenia się przegrzeją, mogą ograniczyć wydajność procesora lub karty graficznej, co może mieć nieoczekiwany wpływ na działanie aplikacji. Aplikacje lub gry, które zawierają skomplikowaną grafikę, wymagają dużych zasobów obliczeniowych lub utrzymują aktywność sieci, są bardziej podatne na problemy.

Używaj interfejsu NDK Thermal API w Androidzie 11, aby monitorować zmiany temperatury na urządzeniu, a potem podejmować działania w celu zmniejszenia zużycia energii i obniżenia temperatury urządzenia. Ten interfejs API jest podobny do interfejsu Java Thermal API. Możesz go używać, aby otrzymywać powiadomienia o każdej zmianie stanu termicznego lub bezpośrednio sprawdzać bieżący stan.

Tekst i dane wejściowe

Ulepszone przejścia IME

Android 11 wprowadza nowe interfejsy API, które ułatwiają przejścia między edytorami metod wprowadzania (IME), np. klawiaturami ekranowymi. Te interfejsy API ułatwiają dostosowywanie treści aplikacji w zsynchronizowany sposób z występowaniem i znikaniem IME oraz innymi elementami, takimi jak pasek stanu i pasek nawigacyjny.

Aby wyświetlić IME, gdy fokus jest ustawiony na dowolnym elemencie EditText, wywołaj funkcję view.getInsetsController().show(Type.ime()). (metodę tę można wywołać w dowolnym widoku w tej samej hierarchii co skupiony EditText, nie trzeba jej wywoływać w szczególnie EditText). Aby ukryć IME, wywołaj metodę view.getInsetsController().hide(Type.ime()). Aby sprawdzić, czy IME jest obecnie widoczne, zadzwoń pod numer view.getRootWindowInsets().isVisible(Type.ime()).

Aby zsynchronizować widoki aplikacji z występowaniem i znikaniem klawiatury IME, ustaw listenera na widoku, podając parametr WindowInsetsAnimation.Callback do View.setWindowInsetsAnimationCallback(). (Możesz ustawić tego słuchacza w dowolnym widoku, nie musi to być widok EditText). IME wywołuje metodę onPrepare() słuchacza, a następnie wywołuje onStart() na początku przejścia. Następnie wywołuje funkcję onProgress() na każdym etapie przejścia. Po zakończeniu przejścia IME wywołuje funkcję onEnd(). W dowolnym momencie przejścia możesz sprawdzić, jak daleko zaawansowało, wywołując funkcję WindowInsetsAnimation.getFraction().

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

Sterowanie animacją IME

Możesz też przejąć kontrolę nad animacją IME lub animacją innego paska systemowego, np. paska nawigacyjnego. Aby to zrobić, najpierw wywołaj funkcję setOnApplyWindowInsetsListener(), aby ustawić nowego słuchacza zmian w ramce okna:

Kotlin

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

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

Java

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

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

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

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

Kotlin

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

Java

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

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

Aktualizacje bibliotek ICU

Android 11 aktualizuje pakiet android.icu, aby używać wersji 66 biblioteki ICU, która zastępuje wersję 63 w Androidzie 10. Nowa wersja biblioteki zawiera zaktualizowane dane dotyczące lokalizacji CLDR oraz kilka ulepszeń obsługi międzynarodowej w Androidzie.

Ważniejsze zmiany w nowych wersjach biblioteki:

  • Wiele interfejsów API do formatowania obsługuje teraz nowy typ zwracanego obiektu, który rozszerza FormattedValue.
  • Interfejs API LocaleMatcher został rozszerzony o klasę konstruktora, obsługę typu java.util.Locale oraz klasę wyników z dodatkowymi informacjami o pasowaniu.
  • Obsługiwana jest teraz wersja Unicode 13.

Multimedia

Przydzielanie buforów MediaCodec

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

Nowe zajęcia:
Nowe metody:

Ponadto zmieniliśmy działanie 2 metod w bibliotece MediaCodec.Callback():

onInputBufferAvailable()
Zamiast wywoływać MediaCodec.getInputBuffer()MediaCodec.queueInputBuffer() z indeksem, jeśli aplikacja jest skonfigurowana do używania interfejsu BlockModel API, powinna używać funkcji MediaCodec.getQueueRequest z indeksem, dołączając do slotu blok liniowy lub bufor sprzętowy.
onOutputBufferAvailable()
Zamiast wywoływać funkcję MediaCodec.getOutputBuffer() z indeksem, aplikacje mogą używać funkcji MediaCodec.getOutputFrame() z indeksem, aby uzyskać obiekt OutputFrame z dodatkowymi informacjami i buforami LinearBlock/HardwareBuffer.

Dekodowanie o małym opóźnieniu w MediaCodec

Android 11 MediaCodecobsługuje dekodowanie z niską latencją w przypadku gier i innych aplikacji działających w czasie rzeczywistym. Aby sprawdzić, czy kodek obsługuje dekodowanie z niską latencją, prześlij FEATURE_LowLatency do MediaCodecInfo.CodecCapabilities.isFeatureSupported().

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

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, proces ulegnie awarii.

Nowa funkcja AAudioStream_release() zwalnia strumień, ale go nie zamyka. Pozwala to zwolnić zasoby i zachowuje strumień w znanym stanie. Obiekt będzie przechowywany do momentu wywołania funkcji AAudioStream_close().

Interfejs MediaParser API

MediaParser to nowy interfejs API na niskim poziomie do wyodrębniania multimediów. Jest on bardziej elastyczny niż MediaExtractor i zapewnia dodatkową kontrolę nad funkcjami wyodrębniania multimediów.

Nagrywanie dźwięku z urządzenia USB

Gdy aplikacja bez uprawnień RECORD_AUDIO używa interfejsu UsbManager, aby poprosić o bezpośrednie użycie urządzenia audio USB z możliwością rejestrowania dźwięku (np. słuchawek USB), pojawia się nowe ostrzeżenie z prośbą o potwierdzenie uprawnień do korzystania z urządzenia. System ignoruje opcję „Zawsze używaj”, więc użytkownik musi zaakceptować ostrzeżenie i wyrazić zgodę na dostęp za każdym razem, gdy aplikacja go poprosi.

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

Równoczesny dostęp do mikrofonu

Android 11 dodaje nowe metody do interfejsów API AudioRecord, MediaRecorderAAudioStream. Te metody umożliwiają jednoczesne włączanie i wyłączanie rejestrowania niezależnie od wybranego przypadku użycia. Zobacz Udostępnianie wejścia audio.

Przełącznik wyjścia

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

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

Łączność

Ulepszenia Wi-Fi Passpoint

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

Rozszerzenie interfejsu API sugestii dotyczących sieci Wi-Fi

Android 11 rozszerza interfejs API sugestii Wi-Fi, aby zwiększyć możliwości zarządzania siecią w aplikacji. Dotyczy to m.in. tych funkcji:

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

Aktualizacje CallScreeningService

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

Jeśli CallScreeningService ma uprawnienie READ_CONTACTS, aplikacja otrzymuje powiadomienie o przychodzących lub wychodzących połączeniach z numeru znajdującego się na liście kontaktów użytkownika.

Więcej informacji znajdziesz w artykule Zapobieganie podszywania numeru dzwoniącego.

Aktualizacje interfejsu Open Mobile API

Informacje o obsługiwaniu OMAPI w Androidzie 11 i nowszych znajdziesz w artykule Obsługa czytnika w Open Mobile API.

wydajne sieci VPN,

Aplikacje kierowane na interfejs API na poziomie 30 lub wyższym lub działające na urządzeniach z poziomem interfejsu API 29 lub wyższym mogą stosować IKEv2/IPsec do VPN-ów zarówno konfigurowanych przez użytkownika, jak i zaimplementowanych w 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 dla poszczególnych procesów znajdziesz w artykule Zarządzanie korzystaniem z sieci.

Zezwalanie na wiele zainstalowanych konfiguracji Passpoint z tym samym FQDN

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

Ta funkcja jest przydatna, gdy operator wdraża w swojej sieci więcej niż 1 kombinację kodu kraju komórkowego (MCC) i kodu sieci komórkowej (MNC), ale ma tylko 1 adres FQDN. W Androidzie 11 i nowszych można zainstalować więcej niż 1 profil z tym samym FQDN, który będzie pasować do sieci jako dostawca domowego, gdy użytkownik zainstaluje kartę SIM z MCC lub MNC.

Obsługa anteny GNSS

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

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

Grafika

Dekoder obrazu NDK

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

Interfejs API Liczba klatek

Android 11 udostępnia interfejs API, który umożliwia aplikacjom informowanie systemu o pożądanej liczbie klatek na sekundę w celu zmniejszenia zacięcia na urządzeniach obsługujących różne częstotliwości odświeżania. Informacje o korzystaniu z tego interfejsu API znajdziesz w przewodniku po częstotliwości wyświetlania klatek.

Prośba o pomoc dotyczącą niskiego opóźnienia i sprawdzanie, czy jest ona dostępna

Niektóre wyświetlacze, takie jak niektóre zewnętrzne wyświetlacze i telewizory, mogą wykonywać postprocessing grafiki. To przetwarzanie wsteczne poprawia jakość grafiki, ale może zwiększyć opóźnienie. Nowsze wyświetlacze obsługujące HDMI 2.1 mają automatyczny tryb niskiego opóźnienia (ALLM, znany też jako tryb gry), który minimalizuje opóźnienie przez wyłączenie tego przetwarzania wstecznego. 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 przydatne w przypadku aplikacji takich jak gry czy wideokonferencje, w których niskie opóźnienie jest ważniejsze niż jakość grafiki.

Aby włączyć lub wyłączyć minimalne przetwarzanie po wykonaniu, wywołaj funkcję Window.setPreferMinimalPostProcessing() lub ustaw atrybut okna preferMinimalPostProcessing na true. Nie wszystkie wyświetlacze obsługują minimalne przetwarzanie w postaci postprocessingu. Aby sprawdzić, czy dany wyświetlacz obsługuje tę funkcję, wywołaj nową metodę Display.isMinimalPostProcessingSupported().

Wydajny mechanizm wstrzykiwania warstwy debugowania grafiki

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

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

Obrazy i kamera

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

Począwszy od Androida 11, gdy aktywnie korzystasz z aparatu, aplikacja może wyciszyć tylko wibracje, dźwięki i wibracje lub żadne z nich za pomocą setCameraAudioRestriction().

Rozszerzona obsługa aparatu w emulatorze Androida

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

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

Android 11 dodaje interfejsy API, które umożliwiają obsługę większej liczby aparatów jednocześnie, w tym przedniego i tylnego.

Aby sprawdzić, czy na urządzeniu, na którym działa Twoja aplikacja, jest dostępna obsługa, użyj jednej z tych metod:

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

Ulepszona obsługa obrazów HEIF z wieloma klatkami

Począwszy od Androida 11, jeśli wywołasz metodę ImageDecoder.decodeDrawable() i przekazujesz obraz HEIF zawierający sekwencję klatek (np. animację lub serię zdjęć), metoda zwraca obiekt AnimatedImageDrawable zawierający całą sekwencję obrazów. We wcześniejszych wersjach Androida metoda zwracała BitmapDrawable tylko jednej klatki.

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

Ułatwienia dostępu

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

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

  • Oprócz zwykłego tekstu w objaśnieniach dotyczących usługi ułatwień dostępu można teraz używać języka HTML oraz obrazów. Ta elastyczność ułatwia użytkownikom zrozumienie, czym jest Twoja usługa i jak może im pomóc.
  • Aby pracować z opisem stanu elementu interfejsu użytkownika, który jest bardziej znaczący semantycznie niż contentDescription, wywołaj metodę getStateDescription().
  • Aby żądać, aby zdarzenia dotyku omijały systemowy eksplorator dotyku, wywołaj funkcję setTouchExplorationPassthroughRegion(). Aby gesty pomijały systemowy moduł wykrywania gestów, wywołaj funkcję setGestureDetectionPassthroughRegion().
  • Możesz poprosić o działania IME, takie jak „Enter” i „Dalej”, a także o zrzuty ekranu okien, które nie mają włączonego flagi FLAG_SECURE.

Inne funkcje

Przyczyny zakończenia procesu aplikacji

Android 11 wprowadza metodę ActivityManager.getHistoricalProcessExitReasons(), która podaje przyczyny ostatnich zamykania procesów. Aplikacje mogą używać tej metody do zbierania informacji diagnostycznych o awariach, np. czy zakończenie procesu nastąpiło z powodu błędów ANR, problemów z pamięcią lub z innych przyczyn. Dodatkowo możesz użyć nowej metody setProcessStateSummary() do przechowywania informacji o stanie niestandardowym na potrzeby późniejszej analizy.

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

Dodatkowe materiały

Więcej informacji znajdziesz w artykule Nowe narzędzia w Androidzie 11, które zwiększają prywatność i stabilność aplikacji na Medium.

Ładowarki zasobów

Android 11 wprowadza nowy interfejs API, który umożliwia aplikacjom dynamiczne rozszerzanie sposobu wyszukiwania i wczytywania zasobów. Nowe klasy interfejsu API ResourcesLoader i ResourcesProvider odpowiadają głównie za nowe funkcje. Razem umożliwiają dostarczanie dodatkowych zasobów i komponentów lub modyfikowanie wartości dotychczasowych zasobów i komponentów.

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

Jednym z głównych zastosowań tego interfejsu API jest wczytywanie niestandardowych zasobów. Możesz użyć loadFromDirectory(), aby utworzyć ResourcesProvider, który przekierowuje rozdzielczość zasobów i komponentów opartych na plikach, powodując, że będzie ono wyszukiwać określony katalog, a nie plik APK aplikacji. Do tych zasobów możesz uzyskać dostęp za pomocą rodziny metod open() z klasy interfejsu API AssetManager, tak jak w przypadku zasobów zawartych w pliku APK.

Schemat podpisu plików APK w wersji 4

Android 11 obsługuje schemat podpisu plików APK w wersji 4. Ten schemat generuje nowy rodzaj podpisu w osobnym pliku (apk-name.apk.idsig), ale poza tym jest podobny do wersji 2 i 3. Plik APK nie ulega zmianie. Ten schemat obsługuje instalację przyrostową pliku APK za pomocą ADB, która przyspiesza instalację pliku APK.

Filtry dynamiczne intencji

Aby odbierać intencje, aplikacja musi podczas kompilacji zadeklarować, jakie typy danych może odbierać. W tym celu musi zdefiniować filtr intencji w manifeście aplikacji. W Androidzie 10 i starszych aplikacje nie mają możliwości zmiany filtrów intencji w czasie działania. Jest to problem w przypadku aplikacji do wirtualizacji (takich jak maszyny wirtualne i stacjonarne pulpity zdalne), ponieważ nie mają one możliwości dowiedzenia się, jakie oprogramowanie użytkownik zainstaluje.

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

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

Wartość atrybutu android:mimeGroup to dowolny identyfikator ciągu, który identyfikuje grupę MIME w czasie wykonywania. Możesz uzyskać dostęp do treści grupy MIME i zaktualizować je, przekazując jej identyfikator do tych nowych metod w klasie interfejsu API PackageManager:

Gdy użyjesz programowo dodawania typu MIME do grupy MIME, będzie on działał dokładnie tak samo jak statyczny typ MIME jawnie zadeklarowany w pliku manifestu.

Ulepszenia autouzupełniania

Android 11 wprowadza ulepszenia usług autouzupełniania.

Identyfikatory wskazówek w AssistStructure.ViewNode

Usługi autouzupełniania często obliczają hasz podpisu widoku na podstawie jego właściwości. Wartość wskazówki wyświetlania jest szczególnie przydatna podczas obliczania hasza podpisu, ale ciąg znaków wskazówki może się zmieniać w zależności od lokalizacji telefonu. Aby rozwiązać ten problem, Android 11 rozszerza AssistStructure.ViewNode o nową metodę getHintIdEntry(), która zwraca identyfikator zasobu dla tekstu podpowiedzi widoku. Ta metoda zapewnia wartość niezależną od języka, której można używać do obliczania skrótów podpisu.

Zdarzenia dotyczące wyświetlanych zbiorów danych

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

Integracja z klawiaturą ekranową

Klawiatury i inne systemy IME mogą teraz wyświetlać sugestie autouzupełniania w ramce paska sugestii lub podobnego interfejsu zamiast w menu. Aby chronić informacje poufne, takie jak hasła czy numery kart kredytowych, sugestie są wyświetlane użytkownikowi, ale nie są znane IME, dopóki użytkownik ich nie wybierze. Informacje o tym, jak IME i menedżery haseł mogą obsługiwać tę funkcję, znajdziesz w artykule Integracja autouzupełniania z klawiaturami.

Udostępnianie danych usłudze przechwytywania treści

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

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