Funkcje i interfejsy API Androida 9

Android 9 (poziom interfejsu API 28) oferuje użytkownikom i deweloperom nowe, przydatne funkcje. W tym dokumencie znajdziesz informacje o nowościach dla deweloperów.

Aby dowiedzieć się więcej o nowych interfejsach API, przeczytaj raport o różnicach między interfejsami API lub zapoznaj się z materiałami referencyjnymi interfejsu API na Androida. Zapoznaj się też ze zmianami w działaniu Androida 9, aby dowiedzieć się, w jakich obszarach zmiany na platformie mogą wpływać na Twoje aplikacje.

Pozycjonowanie wnętrz za pomocą RTT Wi-Fi

Nowe interfejsy RTT API obsługują pozycjonowanie wewnątrz aplikacji.

Android 9 dodaje obsługę protokołu Wi-Fi IEEE 802.11-2016, zwanego też czasem błądzenia w sieci Wi-Fi (RTT), dzięki czemu możesz w aplikacjach używać funkcji lokalizowania wnętrz w aplikacjach.

Na urządzeniach z Androidem 9 obsługującym sprzęt aplikacje mogą używać interfejsów API RTT do pomiaru odległości od pobliskich punktów dostępu Wi-Fi (APN), które obsługują RTT. Na urządzeniu muszą być włączone usługi lokalizacyjne i skanowanie Wi-Fi (w sekcji Ustawienia > Lokalizacja), a aplikacja musi mieć uprawnienie ACCESS_FINE_LOCATION. Urządzenie nie musi łączyć się z punktami dostępu, aby używać RTT. Ze względu na ochronę prywatności tylko telefon może określić odległość od punktu dostępu. Punkty dostępu nie mają takich informacji.

Jeśli urządzenie mierzy odległość do co najmniej 3 punktów dostępu, możesz użyć algorytmu multilateracji, aby oszacować położenie urządzenia, które najlepiej pasuje do tych pomiarów. Wynik jest zwykle dokładny z dokładnością do 1–2 metrów.

Dzięki tej dokładności możesz tworzyć nowe funkcje, takie jak nawigacja w budynku i precyzyjne usługi oparte na lokalizacji, np. jednoznaczne sterowanie głosem (np. „Włącz to światło”) i informacje oparte na lokalizacji (np. „Czy są jakieś oferty specjalne dotyczące tego produktu?”).

Zobacz używany interfejs Wi-Fi RTT API w aplikacji demonstracyjnej Android WifiRttScan.

Więcej informacji znajdziesz w artykule na temat lokalizacji Wi-Fi w zakresie RTT.

Obsługa wycięcia w ekranie

Ekran opcji programisty z różnymi rozmiarami wycięcia

Testowanie wycięcia w ekranie za pomocą emulatora

Android 9 obsługuje najnowsze ekrany od krawędzi do krawędzi z wycięciem w ekranie pod kątem aparatów i głośników. Klasa DisplayCutout pozwala ustalić lokalizację i kształt niedziałających obszarów, w których treści nie powinny być wyświetlane. Aby określić istnienie i umiejscowienie tych wycięć, użyj metody getDisplayCutout().

Nowy atrybut układu okna (layoutInDisplayCutoutMode) umożliwia aplikacji układanie treści wokół wycięć w urządzeniu. Możesz ustawić jedną z tych wartości tego atrybutu:

Możesz symulować wycięcie w ekranie na dowolnym urządzeniu lub emulatorze z Androidem 9 w ten sposób:

  1. Włącz opcje programisty.
  2. Na ekranie Opcje programisty przewiń w dół do sekcji Rysunek i wybierz Symuluj wyświetlacz z wycięciem.
  3. Wybierz rozmiar wycięcia.

Powiadomienia

Android 9 wprowadza kilka ulepszeń w powiadomieniach. Wszystkie z nich są dostępne dla deweloperów korzystających z interfejsu API na poziomie 28 lub wyższym.

Powiadomienia o wiadomościach

MessagingStyle ze zdjęciem.

Powiadomienie o wiadomościach

MessagingStyle – odpowiedzi i rozmowa.

Przykładowy kod, który korzysta z powiadomień, w tym funkcje Androida 9, znajdziesz w artykule PeopleSample.

Ulepszone wiadomości

Począwszy od Androida 7.0 (poziom interfejsu API 24) możesz dodawać działanie, aby odpowiadać na wiadomości lub wpisywać inny tekst bezpośrednio z powiadomienia. Android 9 wzbogaca tę funkcję o te ulepszenia:

  • Uproszczona obsługa uczestników rozmowy: klasa Person służy do identyfikowania osób zaangażowanych w rozmowę, w tym ich awatarów i identyfikatorów URI. Wiele innych interfejsów API, np. addMessage(), korzysta teraz z klasy Person zamiast CharSequence. Klasa Person obsługuje też wzorzec projektu Builder.

  • Obsługa obrazów: Android 9 wyświetla teraz obrazy w powiadomieniach o wiadomościach na telefonach. Aby wyświetlić obraz, w wiadomości możesz użyć setData(). Poniższy fragment kodu pokazuje, jak utworzyć Person i wiadomość zawierającą obraz.

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • Zapisywanie odpowiedzi jako wersji roboczych: aplikacja może pobrać kod EXTRA_REMOTE_INPUT_DRAFT wysłany przez system, gdy użytkownik nieumyślnie zamknie powiadomienie o wiadomościach. Za pomocą tego dodatku możesz wstępnie wypełnić pola tekstowe w aplikacji, aby użytkownicy mogli dokończyć odpowiedź.

  • Sprawdzanie, czy rozmowa jest rozmową grupową: za pomocą tagu setGroupConversation() możesz celowo określić, czy rozmowa jest rozmową grupową, czy nie.

  • Ustaw działanie semantyczne intencji: metoda setSemanticAction() pozwala nadać działaniu semantyczne znaczenie, np. „oznacz jako przeczytane”, „usuń”, „odpowiedz” itd.

  • SmartResponse: Android 9 obsługuje te same sugerowane odpowiedzi, które są dostępne w aplikacji do obsługi wiadomości. Użyj RemoteInput.setChoices(), aby udostępnić użytkownikowi szereg standardowych odpowiedzi.

Ustawienia kanału, transmisje i tryb Nie przeszkadzać

W Androidzie 8.0 wprowadziliśmy kanały powiadomień, które umożliwiają tworzenie dostosowywanych przez użytkownika kanałów dla każdego typu powiadomień, które chcesz wyświetlać. Android 9 upraszcza ustawienia kanału powiadomień dzięki tym zmianom:

  • Blokowanie grup kanałów: użytkownicy mogą teraz blokować całe grupy kanałów w ustawieniach powiadomień z aplikacji. Możesz użyć metody isBlocked(), aby określić, kiedy grupa jest zablokowana, i nie wysyłać żadnych powiadomień dotyczących kanałów z tej grupy.

    Dodatkowo aplikacja może za pomocą nowej metody getNotificationChannelGroup() wysyłać zapytania o bieżące ustawienia grupy kanałów.

  • Nowe typy intencji związanych z nadawaniem: system Android wysyła teraz intencje transmisji po zmianie stanu blokowania kanałów powiadomień i grup kanałów. Aplikacja, do której należy zablokowany kanał lub grupa, może nasłuchiwać tych intencji i odpowiednio reagować. Więcej informacji o tych działaniach intencji i dodatkach znajdziesz na zaktualizowanej liście stałych w dokumentacji NotificationManager. Więcej informacji o reagowaniu na intencje transmisji znajdziesz w artykule Przesyłanie danych.

  • NotificationManager.Policy ma 3 nowe kategorie priorytetu Nie przeszkadzać:

  • NotificationManager.Policy ma też 7 nowych wartości stałych Do-Not-Disturb, które służą do eliminowania zakłóceń wizualnych:

Obsługa wielu kamer i aktualizacje dotyczące kamer

Na urządzeniach z Androidem 9 możesz odtwarzać transmisje jednocześnie z co najmniej 2 kamer fizycznych. Na urządzeniach z dwoma przednim lub podwójnym aparatem tylnym możesz wprowadzać innowacyjne funkcje, które nie są dostępne przy użyciu samego jednego aparatu, takie jak płynne powiększenie, bokeh i obraz stereo. Interfejs API umożliwia też wywoływanie logicznego, czyli scalonego strumienia z kamery, który automatycznie przełącza się między co najmniej 2 kamerami.

Inne ulepszenia dotyczące aparatu obejmują dodatkowe parametry sesji, które pomagają zmniejszyć opóźnienia podczas początkowego przechwytywania, oraz udostępnianie powierzchni, które umożliwia klientom kamery obsługę różnych przypadków użycia bez konieczności zatrzymywania i uruchamiania transmisji z kamery. Dodaliśmy również interfejsy API do obsługi lampy błyskowej zależne od wyświetlacza oraz dostęp do sygnałów czasowych OIS, które umożliwiają stabilizację obrazu na poziomie aplikacji i efekty specjalne.

W Androidzie 9 interfejs API wielu aparatów obsługuje aparaty monochromatyczne na urządzeniach z obsługą FULL lub LIMITED. Jednokolorowe dane wyjściowe są uzyskiwane za pomocą formatu YUV_420_888, w którym Y to skalę szarości, U (Cb) 128, a V (Cr) – 128.

Android 9 umożliwia też obsługę zewnętrznych kamer USB/UVC na obsługiwanych urządzeniach.

Dekoder obrazów na potrzeby elementów rysowalnych i map bitowych

Android 9 wprowadza klasę ImageDecoder, która stanowi zmodernizowane podejście do dekodowania obrazów. Używaj tej klasy zamiast interfejsów API BitmapFactory i BitmapFactory.Options.

ImageDecoder umożliwia utworzenie Drawable lub Bitmap na podstawie bufora bajtów, pliku lub identyfikatora URI. Aby zdekodować obraz, najpierw wywołaj createSource(), podając jego źródło. Następnie wywołaj decodeDrawable() lub decodeBitmap(), przekazując obiekt ImageDecoder.Source, aby utworzyć element Drawable lub Bitmap. Aby zmienić ustawienia domyślne, przekaż OnHeaderDecodedListener do decodeDrawable() lub decodeBitmap(). Funkcja ImageDecoder wywołuje onHeaderDecoded() z domyślną szerokością i wysokością obrazu, jeśli są one znane. Jeśli zakodowany obraz to animowany obraz GIF lub WebP, decodeDrawable() zwraca element Drawable będący wystąpieniem klasy AnimatedImageDrawable.

Właściwości obrazu można ustawić na różne sposoby:

  • Aby przeskalować zdekodowany obraz do dokładnego rozmiaru, przekaż wymiary docelowe do setTargetSize(). Możesz też skalować obrazy, korzystając z rozmiaru próbki. Przekaż rozmiar próbki bezpośrednio do setTargetSampleSize().
  • Aby przyciąć obraz, który mieści się w zakresie skalowanego obrazu, wywołaj metodę setCrop().
  • Aby utworzyć zmienną mapę bitową, przekaż true do setMutableRequired().

ImageDecoder pozwala też dodawać do obrazu niestandardowe i skomplikowane efekty, takie jak zaokrąglone narożniki czy maski koła. Użyj setPostProcessor() z instancją klasy PostProcessor, aby wykonywać dowolne polecenia rysowania.

Animacja

Android 9 wprowadza klasę AnimatedImageDrawable do rysowania i wyświetlania animowanych obrazów GIF i WebP. AnimatedImageDrawable działa podobnie do AnimatedVectorDrawable pod tym względem, że wątek renderowania kieruje animacje obiektu AnimatedImageDrawable. Wątek renderowania wykorzystuje też do dekodowania wątek roboczy, dzięki czemu dekodowanie nie zakłóca innych operacji w wątku renderowania. Ta implementacja umożliwia wyświetlanie animowanego obrazu w aplikacji bez konieczności zarządzania aktualizacjami ani zakłócania innych zdarzeń w wątku interfejsu aplikacji.

Element AnimatedImageDrawable można zdekodować za pomocą wystąpienia ImageDecoder. Ten fragment kodu pokazuje, jak za pomocą ImageDecoder do dekodowania elementów AnimatedImageDrawable:

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder ma kilka metod, które umożliwiają dalsze modyfikowanie obrazu. Możesz na przykład zmodyfikować wygląd obrazu za pomocą metody setPostProcessor(), np. zastosować maskę okrągłą lub zaokrąglone narożniki.

HDR VP9 Video, kompresja obrazu HEIF i interfejsy Media API

Android 9 ma wbudowaną obsługę High Dynamic Range (HDR) VP9 Profile 2, dzięki czemu można wyświetlać użytkownikom filmy w trybie HDR z YouTube, Filmów Play i innych źródeł na urządzeniach, które obsługują tę technologię.

Android 9 dodaje też obsługę kodowania obrazów w formacie HEIF lub HEIC, który zwiększa kompresję i zmniejsza ilość miejsca na dane i wykorzystanie danych sieciowych. Próbki obrazów nieruchomych HEIF są obsługiwane w klasach MediaMuxer i MediaExtractor. Obsługa platformy na urządzeniach z Androidem 9 ułatwia wysyłanie i wykorzystywanie obrazów HEIF z serwera backendu. Gdy upewnisz się, że Twoja aplikacja jest zgodna z tym formatem danych do udostępniania i wyświetlania, wypróbuj HEIF jako format przechowywania obrazów w aplikacji. Możesz dokonać konwersji jpeg-to-heic za pomocą metody ImageDecoder lub BitmapFactory (która uzyskuje plik bitmapy z pliku JPEG). Następnie możesz użyć HeifWriter do zapisywania obrazów HEIF z buforów bajtów YUV lub wystąpień Surface bądź Bitmap.

Dane o multimediach są też dostępne w klasach AudioTrack, AudioRecord i MediaDrm.

Android 9 wprowadza metody do klasy MediaDRM, które pozwalają uzyskiwać wskaźniki, poziomy HDCP, poziomy zabezpieczeń i liczbę sesji oraz zapewniają większą kontrolę nad poziomami zabezpieczeń i bezpiecznymi postojami. Szczegółowe informacje znajdziesz w raporcie Różnice w interfejsach API.

W Androidzie 9 interfejs AAudio API dodaje obsługę kilku dodatkowych atrybutów AAudioStream, takich jak wykorzystanie, typ treści i gotowe ustawienia wejściowe. Za pomocą tych atrybutów można tworzyć strumienie dostrojone pod kątem aplikacji VoIP lub kamer. Możesz też ustawić identyfikator sesji, aby powiązać strumień AAudio z subskładnią, która może zawierać efekty. Użyj interfejsu API AudioEffect, aby kontrolować efekty.

Android 9 wprowadza interfejs API AudioEffect do przetwarzania dynamiki. Dzięki tym lekcjom możesz tworzyć efekty audio związane z kanałem – np. równoważenie, kompresję wielopasmową i ogranicznik – na wielu etapach. Liczbę pasm i aktywnych etapów można skonfigurować, a większość parametrów można kontrolować w czasie rzeczywistym.

Wrażliwość na koszt danych w JobScheduler

Od Androida 9 JobScheduler może używać sygnałów o stanie sieci dostarczanych przez operatorów, aby poprawić obsługę zadań związanych z siecią.

Zadania mogą zadeklarować szacowany rozmiar danych, wstępnie pobierać sygnały i określić szczegółowe wymagania sieciowe. JobScheduler będzie też zarządzać pracą zgodnie ze stanem sieci. Jeśli na przykład sieć sygnalizuje, że jest przeciążona, JobScheduler może odroczyć duże żądania sieciowe. Gdy korzystasz z sieci bez pomiaru, JobScheduler może uruchamiać zadania pobierania z wyprzedzeniem, aby zwiększyć wygodę użytkowników, np. przez pobieranie z wyprzedzeniem nagłówków.

Podczas dodawania zadań pamiętaj, aby używać setEstimatedNetworkBytes(), setPrefetch() i setRequiredNetwork(), jeśli jest to konieczne, abyJobScheduler wykonać zadanie. Pamiętaj, by podczas wykonywania zadania użyć obiektu Network zwróconego przez JobParameters.getNetwork(). W przeciwnym razie będziesz domyślnie korzystać z domyślnej sieci urządzenia, która może nie spełniać Twoich wymagań i spowodować niezamierzone użycie danych.

Neural Networks API 1.1

Interfejs Neural Networks API został wprowadzony w Androidzie 8.1 (poziom API 27) w celu przyspieszenia działania systemów uczących się na urządzeniu z Androidem. Android 9 rozwija i ulepsza interfejs API, dodając obsługę 9 nowych operacji:

Znany problem: podczas przekazywania tensorów ANEURALNETWORKS_TENSOR_QUANT8_ASYMM do operacji ANEURALNETWORKS_PAD, która jest dostępna w Androidzie 9 i nowszych, dane wyjściowe NNAPI mogą nie odpowiadać danym wyjściowym platform systemów uczących się wyższego poziomu, takich jak TensorFlow Lite. Zamiast tego przekazuj tylko ANEURALNETWORKS_TENSOR_FLOAT32, dopóki problem nie zostanie rozwiązany.

Dodatkowo interfejs API wprowadza również nową funkcję ANeuralNetworksModel_relaxComputationFloat32toFloat16(), która pozwala określić, czy obliczać ANEURALNETWORKS_TENSOR_FLOAT32 z zakresem i dokładnością nieprzekraczającym 16-bitowego formatu zmiennoprzecinkowych IEEE 754.

Platforma autouzupełniania

Android 9 wprowadza wiele ulepszeń, które mogą wdrożyć usługi autouzupełniania, aby jeszcze bardziej zwiększyć wygodę użytkowników korzystających z formularzy. Więcej informacji o korzystaniu z funkcji autouzupełniania w aplikacji znajdziesz w przewodniku po platformie autouzupełniania.

Ulepszenia zabezpieczeń

Android 9 oferuje szereg funkcji zabezpieczeń, których podsumowanie znajdziesz w tych sekcjach:

Zabezpieczone potwierdzenie w Androidzie

Obsługiwane urządzenia z Androidem 9 lub nowszym umożliwiają korzystanie z bezpiecznego potwierdzenia Androida. Podczas korzystania z tego przepływu pracy aplikacja wyświetla użytkownikowi prośbę o zatwierdzenie krótkiej informacji. Dzięki temu aplikacja może potwierdzić, że użytkownik chce zrealizować poufną transakcję, np. dokonać płatności.

Jeśli użytkownik zaakceptuje instrukcję, Magazyn kluczy Androida otrzyma i zapisze podpis kryptograficzny chroniony przez kod uwierzytelniania wiadomości przy użyciu haszowania (Keyed-HMAC). Gdy magazyn kluczy Android potwierdzi poprawność wiadomości, aplikacja może użyć klucza wygenerowanego z trustedConfirmationRequired w zaufanym środowisku wykonawczym (TEE), aby podpisać wiadomość zaakceptowaną przez użytkownika. Podpis wskazuje z bardzo dużą pewnością, że użytkownik widział oświadczenie i je zaakceptował.

Uwaga: zabezpieczone potwierdzenie na Androidzie nie zapewnia bezpiecznego kanału informacyjnego dla użytkownika. Aplikacja nie może zakładać żadnych gwarancji poufności innych niż te, które zapewnia platforma Androida. W szczególności nie używaj tego przepływu pracy do wyświetlania informacji poufnych, które nie byłyby zwykle wyświetlane na urządzeniu użytkownika.

Wskazówki dotyczące dodawania obsługi zabezpieczonego potwierdzenia w Androidzie znajdziesz w przewodniku na temat chronionego potwierdzenia w Androidzie.

Okno ujednoliconego uwierzytelniania biometrycznego

W Androidzie 9 system udostępnia w imieniu aplikacji okna uwierzytelniania biometrycznego. Ta funkcja tworzy ustandaryzowany wygląd, styl i umiejscowienie okna, co daje użytkownikom większą pewność, że uwierzytelniają się za pomocą zaufanego biometrycznego narzędzia do sprawdzania danych logowania.

Jeśli Twoja aplikacja używa FingerprintManager do wyświetlania użytkownikom okna uwierzytelniania odciskiem palca, przełącz się na korzystanie z metody BiometricPrompt. BiometricPrompt wyświetla okno uwierzytelniania przez system. Zmienia też swoje działanie, aby dopasować się do wybranego przez użytkownika typu uwierzytelniania biometrycznego.

Moduł zabezpieczeń sprzętowych

Obsługiwane urządzenia z Androidem 9 lub nowszym mogą mieć StrongBox Keymaster – implementację modułu HAL Keymaster zawartego w sprzętowym module zabezpieczeń. Moduł zawiera:

  • Ma własny procesor.
  • Bezpieczne miejsce na dane.
  • Prawdziwy generator liczb losowych.
  • Dodatkowe mechanizmy zapobiegające modyfikowaniu pakietów i nieautoryzowanym instalowaniu aplikacji z nieoficjalnych źródeł.

Podczas sprawdzania kluczy przechowywanych w programie StrongBox Keymaster system potwierdza ich integralność w zaufanym środowisku wykonawczym (TEE).

Więcej informacji o używaniu Strongbox Keymaster znajdziesz w artykule o sprzętowym module zabezpieczeń.

Bezpieczny import kluczy do magazynu kluczy

Android 9 zapewnia dodatkowe bezpieczeństwo odszyfrowywania kluczy, dodając możliwość bezpiecznego importowania zaszyfrowanych kluczy do magazynu kluczy przy użyciu formatu klucza zakodowanego w ASN.1. Keymaster odszyfrowuje klucze w magazynie kluczy, dzięki czemu ich zawartość nigdy nie pojawia się w pamięci hosta urządzenia jako zwykły tekst.

Dowiedz się więcej o bezpiecznym importowaniu zaszyfrowanych kluczy.

Schemat podpisu pliku APK z rotacją klucza

Android 9 dodaje obsługę schematu podpisu plików APK w wersji 3. Ten schemat umożliwia dołączenie rekordu potwierdzenia rotacji w bloku podpisywania dla każdego certyfikatu podpisującego. Ta możliwość umożliwia podpisanie aplikacji nowym certyfikatem podpisywania przez połączenie wcześniejszych certyfikatów podpisywania pliku APK z tym, za pomocą którego został podpisany.

Dowiedz się więcej o rotacji kluczy za pomocą apksigner.

Opcja zezwolenia na odszyfrowywanie klucza tylko na odblokowanych urządzeniach

Android 9 wprowadza flagę unlockedDeviceRequired. Ta opcja określa, czy magazyn kluczy wymaga odblokowania ekranu, zanim będzie można odszyfrować przesyłane lub przechowywane dane za pomocą określonego klucza. Klucze tego typu doskonale nadają się do szyfrowania danych wrażliwych przechowywanych na dysku, np. dotyczących stanu zdrowia lub firmowych danych. Flaga ta daje użytkownikom większą pewność, że w przypadku utraty lub kradzieży telefonu nie uda się odszyfrować danych, gdy urządzenie jest zablokowane.

Aby zabezpieczyć klucz przed odszyfrowaniem, gdy urządzenie jest zablokowane, włącz flagę, przekazując true do metody setUnlockedDeviceRequired(). Po wykonaniu tego kroku, gdy ekran użytkownika jest zablokowany, każda próba odszyfrowania lub podpisania danych przy użyciu tego klucza kończy się niepowodzeniem. Dostęp do zablokowanego urządzenia wymaga podania kodu PIN, hasła, odcisku palca lub innego zaufanego czynnika.

Obsługa starszego szyfrowania

Urządzenia z Androidem 9 i pakietem Keymaster 4 obsługują algorytm Triple Data Encryption Algorithm, czyli Triple DES. Jeśli Twoja aplikacja działa ze starszymi systemami, które wymagają Triple DES, użyj tego typu mechanizmu szyfrowania do szyfrowania poufnych danych logowania.

Więcej informacji o tym, jak zwiększyć bezpieczeństwo aplikacji, znajdziesz w artykule Bezpieczeństwo dla deweloperów aplikacji na Androida.

Wycofanie WPS

Ze względów bezpieczeństwa wycofaliśmy WPS (Wi-Fi Protected Setup).

Kopie zapasowe Androida

Android 9 ma nowe funkcje i opcje dla programistów związane z tworzeniem kopii zapasowych i przywracaniem danych. Szczegółowe informacje o tych zmianach znajdziesz w kolejnych sekcjach.

Kopie zapasowe szyfrowania po stronie klienta

Android 9 dodaje obsługę szyfrowania kopii zapasowych Androida za pomocą obiektu tajnego po stronie klienta. Ta pomoc jest włączana automatycznie, gdy są spełnione te warunki:

Gdy ten środek ochrony prywatności jest włączony, do przywrócenia danych z kopii zapasowych utworzonych przez urządzenie użytkownika wymagany jest kod PIN, wzór lub hasło. Więcej informacji o technologii, na podstawie której działa ta funkcja, znajdziesz w dokumencie Google Cloud Key Vault Service.

Określ warunki urządzenia wymagane do utworzenia kopii zapasowej

Jeśli dane aplikacji zawierają informacje poufne lub ustawienia, Android 9 umożliwia zdefiniowanie warunków urządzenia, pod kątem których dane aplikacji mają być uwzględniane w kopii zapasowej użytkownika. Może to być na przykład włączenie szyfrowania po stronie klienta lub lokalne przenoszenie danych między urządzeniami.

Więcej informacji o tworzeniu kopii zapasowej danych na urządzeniach z Androidem znajdziesz w artykule Omówienie kopii zapasowej danych.

Ułatwienia dostępu

Android 9 wprowadza ulepszenia do ułatwień dostępu, dzięki którym możesz zapewnić jeszcze lepsze wrażenia użytkownikom aplikacji.

Semantyka nawigacji

Atrybuty dodane w Androidzie 9 ułatwiają określanie sposobu przechodzenia usług ułatwień dostępu, a zwłaszcza czytników ekranu, z jednej części ekranu do drugiej. Te atrybuty ułatwiają użytkownikom z wadą wzroku szybkie poruszanie się po tekście w interfejsie aplikacji i dokonywanie wyboru.

Na przykład w aplikacji zakupowej czytnik ekranu może pomóc użytkownikom w bezpośrednim przechodzeniu z jednej kategorii ofert specjalnych do kolejnej, bez konieczności odczytania wszystkich produktów w danej kategorii przed przejściem do kolejnej.

Tytuły paneli ułatwień dostępu

W Androidzie 8.1 (poziom interfejsu API 27) i starszych usługi ułatwień dostępu nie zawsze mogą określić, kiedy określony panel ekranu został zaktualizowany, na przykład gdy aktywność zastępuje jeden fragment innym fragmentem. Panele składają się z logicznie pogrupowanych, powiązanych wizualnie elementów interfejsu, które zwykle tworzą fragment.

W Androidzie 9 możesz w przypadku tych paneli podać tytuły paneli ułatwień dostępu lub tytuły, które umożliwiają identyfikację osób. Jeśli panel ma tytuł panelu ułatwień dostępu, usługi ułatwień dostępu otrzymają bardziej szczegółowe informacje po zmianie panelu. Dzięki temu usługi mogą przekazywać użytkownikom bardziej szczegółowe informacje o zmianach w interfejsie.

Aby określić tytuł panelu, użyj atrybutu android:accessibilityPaneTitle. Możesz też zaktualizować tytuł panelu interfejsu, który jest zastąpiony w środowisku wykonawczym, korzystając z setAccessibilityPaneTitle(). Możesz na przykład podać tytuł obszaru treści obiektu Fragment.

Nawigacja oparta na nagłówkach

Jeśli aplikacja wyświetla treści tekstowe zawierające logiczne nagłówki, ustaw wartość atrybutu android:accessibilityHeading na true w przypadku wystąpienia elementów View, które reprezentują te nagłówki. Dodając te nagłówki, umożliwiasz usługom ułatwień dostępu pomaganie użytkownikom w przechodzeniu bezpośrednio z jednego nagłówka do drugiego. Każda usługa ułatwień dostępu może wykorzystać tę możliwość do usprawnienia nawigacji po interfejsie użytkownika.

Nawigacja w grupie i dane wyjściowe

Dotychczas czytniki ekranu używały atrybutu android:focusable do określania, kiedy powinny odczytywać obiekty ViewGroup lub kolekcję View jako pojedynczą jednostkę. Dzięki temu użytkownicy będą mogli zrozumieć, że widoki danych są ze sobą logicznie powiązane.

W Androidzie 8.1 i starszych musisz oznaczyć każdy obiekt View w interfejsie ViewGroup jako nieobjęty ostrością, a sam obiekt ViewGroup jako możliwy do zaznaczenia. To ustawienie sprawiło, że niektóre wystąpienia funkcji View zostały oznaczone jako możliwe do zaznaczenia w sposób, który utrudnił nawigację przy użyciu klawiatury.

Począwszy od Androida 9 możesz używać atrybutu android:screenReaderFocusable zamiast atrybutu android:focusable w sytuacjach, gdy wprowadzenie możliwości zaznaczenia obiektu View ma niepożądane konsekwencje. Czytniki ekranu umieszczają zaznaczenie na wszystkich elementach, które android:screenReaderFocusable lub android:focusable mają ustawioną wartość true.

Wygodne działania

Android 9 obsługuje wykonywanie dogodnych czynności w imieniu użytkowników:

Interakcja z etykietkami
Dodane funkcje w platformie ułatwień dostępu zapewniają dostęp do etykietek w interfejsie aplikacji. getTooltipText() pozwala odczytać treść etykietki, a ACTION_SHOW_TOOLTIP i ACTION_HIDE_TOOLTIP – aby pokazywać i ukrywać etykietki z instancji View.
Dodano działania globalne
Android 9 wprowadza obsługę 2 dodatkowych działań na urządzeniu w klasie AccessibilityService. Twoja usługa może pomóc użytkownikom w blokowaniu urządzeń i robieniu zrzutów ekranu za pomocą odpowiednio działań GLOBAL_ACTION_LOCK_SCREEN i GLOBAL_ACTION_TAKE_SCREENSHOT.

Szczegóły zmiany okna

Android 9 ułatwia śledzenie aktualizacji okien aplikacji, gdy aplikacja otwiera wiele okien jednocześnie. Gdy wystąpi zdarzenie TYPE_WINDOWS_CHANGED, użyj interfejsu API getWindowChanges(), aby określić, jak okna się zmieniły. Podczas aktualizacji trybu wielu okien każde okno generuje własny zestaw zdarzeń. Metoda getSource() zwraca widok główny okna powiązanego z poszczególnymi zdarzeniami.

Jeśli aplikacja ma zdefiniowane tytuły paneli ułatwień dostępu dla swoich obiektów View, usługa może rozpoznać, że interfejs aplikacji jest aktualizowany. Po wystąpieniu zdarzenia TYPE_WINDOW_STATE_CHANGED użyj typów zwracanych przez metodę getContentChangeTypes(), aby określić, jak zmieniło się okno. Na przykład platforma może wykryć, że panel ma nowy tytuł lub zniknął.

Obrót

Aby wyeliminować niezamierzone obroty, dodaliśmy tryb, który przypina bieżącą orientację nawet wtedy, gdy urządzenie zmieni położenie. W razie potrzeby użytkownicy mogą ręcznie aktywować obrót, naciskając przycisk na pasku systemowym.

W większości przypadków wpływ na zgodność aplikacji jest minimalny. Jeśli jednak Twoja aplikacja ma niestandardowe ustawienia obracania lub ustawienia orientacji ekranu w nietypowych ustawieniach, mogą wystąpić problemy, które wcześniej byłyby niezauważane, gdy użytkownik ustawił orientację pionową jako zawsze pionową. Zachęcamy do przyjrzenia się rotacjom wszystkich kluczowych działań w aplikacji i upewnienia się, że wszystkie ustawienia orientacji ekranu zapewniają nam optymalne wrażenia.

Więcej informacji znajdziesz w powiązanych zmianach działania.

Obrót na urządzeniu mobilnym pokazujący nowy tryb rotacji, w którym użytkownicy mogą ręcznie uruchamiać rotację

Nowy tryb rotacji umożliwia użytkownikom ręczne uruchamianie rotacji w razie potrzeby za pomocą przycisku na pasku systemowym.

Tekst

Android 9 udostępnia na platformie te funkcje związane z tekstem:

  • Wstępnie obliczony tekst: klasa PrecomputedText zwiększa wydajność renderowania tekstu, umożliwiając wcześniejsze obliczenie i zapisanie wymaganych informacji w pamięci podręcznej. Dzięki nim aplikacja może też wykorzystywać układ tekstu poza głównym wątkiem.

  • Magnifier: klasa Magnifier to widżet platformy, który udostępnia interfejs API lupy, umożliwiając spójne korzystanie z funkcji powiększania we wszystkich aplikacjach.

  • Smart Linkify: Android 9 rozszerza klasę TextClassifier, która wykorzystuje systemy uczące się do identyfikowania niektórych elementów w zaznaczonym tekście i sugerowania działań. TextClassifier może na przykład umożliwić Twojej aplikacji wykrywanie, że użytkownik wybrał numer telefonu. Aplikacja może zasugerować użytkownikowi, żeby zadzwonił z tego numeru. Funkcje w zadaniu TextClassifier zastępują funkcje klasy Linkify.

  • Układ tekstu: kilka wygodnych metod i atrybutów ułatwia implementację projektu interfejsu. Więcej informacji znajdziesz w dokumentacji referencyjnej TextView.

Wcześniejsze konwertowanie plików DEX za pomocą ART

Na urządzeniach z Androidem 9 lub nowszym kompilator z wyprzedzeniem (ART) w środowisku wykonawczym Androida dodatkowo optymalizuje skompresowane pliki Dalvik Executable (DEX), konwertując je w pakiecie aplikacji na bardziej kompaktową reprezentację. Dzięki tej zmianie aplikacja może się szybciej uruchamiać oraz zużywać mniej miejsca na dysku i pamięci RAM.

Ta poprawa jest szczególnie przydatna w przypadku słabszych urządzeń z mniejszą szybkością wejścia/wyjścia dysku.

Śledzenie systemu na urządzeniu

Android 9 umożliwia rejestrowanie logów czasu systemu z urządzenia i udostępnianie raportu z nimi zespołowi programistów. Ten raport obsługuje wiele formatów, w tym HTML.

Dzięki gromadzeniu tych logów czasu możesz rejestrować dane o czasie związane z procesami i wątkami w aplikacji oraz wyświetlać inne rodzaje istotnych globalnie stanów urządzeń.

Więcej informacji o tym narzędziu znajdziesz w artykule Śledzenie systemu na urządzeniu.