Funkcje i interfejsy API Androida 9

Android 9 (poziom 28 interfejsu API) wprowadza nowe świetne funkcje i możliwości dla użytkowników i programistów. W tym dokumencie znajdziesz informacje o nowościach dla deweloperów.

Więcej informacji o nowych interfejsach API znajdziesz w raporcie o różnicach w interfejsach API lub w dokumentacji interfejsów API Androida. Zapoznaj się też z zmianami w działaniu Androida 9, aby dowiedzieć się, w jakich obszarach zmiany na platformie mogą wpłynąć na Twoje aplikacje.

Pozycjonowanie w pomieszczeniach za pomocą Wi-Fi RTT

Nowe interfejsy RTT API obsługują pozycjonowanie w pomieszczeniach w aplikacjach.

Android 9 dodaje obsługę protokołu IEEE 802.11-2016 Wi-Fi, znanego też jako Wi-Fi Round-Trip-Time (RTT), dzięki czemu możesz korzystać z pozycjonowania w pomieszczeniach w swoich aplikacjach.

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

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

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

Zobacz, jak działa interfejs WiFi RTT API w aplikacji demonstracyjnej Android WifiRttScan.

Więcej informacji znajdziesz w artykule Lokalizacja Wi-Fi: pomiar odległości za pomocą RTT.

Obsługa wycięcia w ekranie

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

Testowanie wycięcia na wyświetlaczu za pomocą emulatora

Android 9 obsługuje najnowsze ekrany bez ramki z wycięciami na aparaty i głośniki. Klasa DisplayCutout umożliwia określenie lokalizacji i kształtu obszarów niefunkcjonalnych, w których nie należy wyświetlać treści. Aby określić istnienie i umiejscowienie tych obszarów wycięcia, użyj metody getDisplayCutout().

Nowy atrybut układu okna, layoutInDisplayCutoutMode, umożliwia aplikacji rozmieszczenie treści wokół wycięć na urządzeniu. Ten atrybut może mieć jedną z tych wartości:

Wycięcie na ekranie możesz symulować 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 Rysowanie i wybierz Symuluj wyświetlacz z wycięciem.
  3. Wybierz rozmiar wycięcia.

Powiadomienia

Android 9 wprowadza kilka ulepszeń powiadomień, które są dostępne dla programistów kierujących reklamy na interfejs API na poziomie 28 lub wyższym.

Powiadomienia o wiadomościach

MessagingStyle z dołączonym zdjęciem.

Powiadomienie o wiadomości

MessagingStyle z odpowiedziami i rozmową.

Przykładowy kod, który korzysta z powiadomień, w tym z funkcji Androida 9, znajdziesz w przykładzie People.

Ulepszone funkcje przesyłania wiadomości

Począwszy od Androida 7.0 (interfejs API na poziomie 24), możesz dodawać działanie, które umożliwia odpowiadanie na wiadomości lub wpisywanie innego tekstu bezpośrednio z poziomu powiadomienia. Android 9 ulepsza tę funkcję, wprowadzając następujące zmiany:

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 pobierać EXTRA_REMOTE_INPUT_DRAFT wysłane przez system, gdy użytkownik przypadkowo zamknie powiadomienie o wiadomości. Możesz użyć tego dodatku, aby wstępnie wypełnić pola tekstowe w aplikacji, dzięki czemu użytkownicy będą mogli dokończyć odpowiedź.

  • Określanie, czy rozmowa jest rozmową grupową: możesz użyć setGroupConversation() do celowego określenia, czy rozmowa jest rozmową grupową, czy nie.

  • Ustawianie działania semantycznego dla intencji: metoda setSemanticAction() umożliwia nadanie działania semantycznego, np. „oznacz jako przeczytane”, „usuń”, „odpowiedz” itp.

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

Ustawienia kanału, transmisje i tryb Nie przeszkadzać

W Androidzie 8.0 wprowadzono 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łów powiadomień dzięki tym zmianom:

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

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

  • Nowe typy intencji rozgłaszania: system Android wysyła teraz intencje rozgłaszania, gdy zmienia się stan blokowania kanałów powiadomień i grup kanałów. Aplikacja, która jest właścicielem zablokowanego kanału lub grupy, może nasłuchiwać tych intencji i odpowiednio reagować. Więcej informacji o tych działaniach i dodatkach znajdziesz na zaktualizowanej liście stałych w NotificationManager. Informacje o reagowaniu na intencje transmisji znajdziesz w artykule Transmisje.

  • NotificationManager.Policy ma 3 nowe kategorie priorytetów trybu Nie przeszkadzać:

  • NotificationManager.Policy ma też 7 nowych stałych trybu Nie przeszkadzać, których możesz używać do tłumienia zakłóceń wizualnych:

Obsługa wielu aparatów i aktualizacje aparatu

Na urządzeniach z Androidem 9 możesz jednocześnie uzyskiwać dostęp do strumieni z co najmniej 2 fizycznych aparatów. Na urządzeniach z dwoma aparatami przednimi lub tylnymi możesz tworzyć innowacyjne funkcje, które nie są możliwe przy użyciu tylko jednego aparatu, takie jak płynne powiększanie, bokeh i stereoskopia. Interfejs API umożliwia też wywoływanie logicznego lub połączonego strumienia z kamery, który automatycznie przełącza się między 2 lub większą liczbą kamer.

Inne ulepszenia aparatu obejmują dodatkowe parametry sesji, które pomagają zmniejszyć opóźnienia podczas początkowego rejestrowania obrazu, oraz udostępnianie powierzchni, które umożliwia klientom aparatu obsługę różnych przypadków użycia bez konieczności zatrzymywania i uruchamiania strumieniowania z kamery. Dodaliśmy też interfejsy API do obsługi lampy błyskowej opartej na wyświetlaczu i dostęp do sygnatur czasowych OIS na potrzeby stabilizacji obrazu na poziomie aplikacji i efektów specjalnych.

W Androidzie 9 interfejs API wielu aparatów obsługuje aparaty monochromatyczne na urządzeniach z funkcją FULL lub LIMITED. Dane wyjściowe w skali szarości są uzyskiwane w formacieYUV_420_888 z Y jako skalą szarości, U (Cb) jako 128 i V (Cr) jako 128.

Android 9 obsługuje też zewnętrzne kamery USB/UVC na obsługiwanych urządzeniach.

ImageDecoder do rysowania i map bitowych

W Androidzie 9 wprowadzono klasę ImageDecoder, która zapewnia nowoczesne podejście do dekodowania obrazów. Używaj tej klasy zamiast interfejsów API BitmapFactory i BitmapFactory.Options.

ImageDecoder umożliwia tworzenie Drawable lub Bitmap z bufora bajtów, pliku lub identyfikatora URI. Aby zdekodować obraz, najpierw wywołaj funkcję createSource() ze źródłem zakodowanego obrazu. Następnie wywołaj decodeDrawable() lub decodeBitmap() przekazując obiekt ImageDecoder.Source, aby utworzyć Drawable lub Bitmap. Aby zmienić ustawienia domyślne, przekaż wartość OnHeaderDecodedListener do parametru decodeDrawable() lub decodeBitmap(). ImageDecoder wywołania onHeaderDecoded() z domyślną szerokością i wysokością obrazu, gdy tylko będą znane. Jeśli zakodowany obraz jest animowanym GIF-em lub plikiem WebP, funkcja decodeDrawable() zwraca wartość Drawable, która jest instancją 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 funkcji setTargetSize(). Możesz też skalować obrazy za pomocą rozmiaru próbki. Przekaż rozmiar próbki bezpośrednio do funkcji setTargetSampleSize().
  • Aby przyciąć obraz w zakresie przeskalowanego obrazu, wywołaj setCrop().
  • Aby utworzyć zmienną mapę bitową, przekaż wartość true do funkcji setMutableRequired().

ImageDecoder umożliwia też dodawanie do obrazu niestandardowych i skomplikowanych efektów, takich jak zaokrąglone rogi czy maski w kształcie koła. Użyj setPostProcessor() z instancją klasy PostProcessor do wykonania dowolnych poleceń rysowania.

Animacja

W Androidzie 9 wprowadzono klasę AnimatedImageDrawable do rysowania i wyświetlania animowanych obrazów GIF i WebP. AnimatedImageDrawable działa podobnie do AnimatedVectorDrawable w tym sensie, że wątek renderowania steruje animacjami AnimatedImageDrawable. Wątek renderowania używa też wątku roboczego do dekodowania, aby dekodowanie nie zakłócało innych operacji w tym wątku. Ta implementacja umożliwia wyświetlanie animowanego obrazu w aplikacji bez zarządzania jego aktualizacjami i bez zakłócania innych zdarzeń w wątku interfejsu aplikacji.

AnimatedImageDrawable można dekodować za pomocą instancji ImageDecoder. Poniższy fragment kodu pokazuje, jak używać funkcji ImageDecoder do dekodowania 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 oferuje kilka metod, które pozwalają dodatkowo modyfikować obraz. Możesz na przykład użyć metody setPostProcessor(), aby zmodyfikować wygląd obrazu, np. zastosować maskę w kształcie koła lub zaokrąglone rogi.

Wideo HDR VP9, kompresja obrazów HEIF i interfejsy API multimediów

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

Android 9 obsługuje też kodowanie obrazów w formacie HEIF (High Efficiency Image File) lub HEIC, co zwiększa kompresję i zmniejsza ilość miejsca na dane oraz zużycie danych sieciowych. Przykłady zdjęć HEIF są obsługiwane w klasach MediaMuxerMediaExtractor. Dzięki obsłudze platformy na urządzeniach z Androidem 9 możesz łatwo wysyłać i wykorzystywać obrazy HEIF z serwera backendu. Po upewnieniu się, że 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 przekonwertować plik JPEG na HEIC za pomocą ImageDecoder lub BitmapFactory (który uzyskuje bitmapę z pliku JPEG). Możesz wtedy użyć HeifWriter do zapisywania statycznych obrazów HEIF z buforów bajtowych YUV lub instancji Surface lub Bitmap.

Wskaźniki dotyczące multimediów są też dostępne w klasach AudioTrack, AudioRecordMediaDrm.

Android 9 wprowadza metody do klasy MediaDRM, które umożliwiają uzyskiwanie danych, poziomów HDCP, poziomów zabezpieczeń i liczby sesji, a także większą kontrolę nad poziomami zabezpieczeń i bezpiecznymi zatrzymaniami. Szczegółowe informacje znajdziesz w raporcie API Diff.

W Androidzie 9 interfejs AAudio API dodaje obsługę kilku dodatkowych atrybutów AAudioStream, w tym użycia, typu treści i ustawienia wstępnego wejścia. Za pomocą tych atrybutów możesz tworzyć strumienie dostosowane do aplikacji VoIP lub kamery. Możesz też ustawić identyfikator sesji, aby powiązać strumień AAudio z podmiksem, który może zawierać efekty. Użyj interfejsu API AudioEffect, aby sterować efektami.

W Androidzie 9 wprowadzono interfejs AudioEffect API do przetwarzania dynamiki. Ta klasa umożliwia tworzenie efektów audio opartych na kanałach, w tym korekcji, kompresji wielopasmowej i limitera, 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 koszty danych w JobScheduler

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

Zadania mogą deklarować szacowany rozmiar danych, sygnalizować wstępne pobieranie i określać szczegółowe wymagania sieciowe. JobScheduler zarządza pracą w zależności od stanu sieci. Na przykład gdy sieć sygnalizuje, że jest przeciążona, JobScheduler może odraczać duże żądania sieciowe. W sieci bez limitu danych JobScheduler może uruchamiać zadania wstępnego pobierania, aby poprawić komfort użytkowania, np. wstępnie pobierać nagłówki.

Podczas dodawania zadań używaj w razie potrzeby tagów setEstimatedNetworkBytes(), setPrefetch()setRequiredNetwork(), aby JobScheduler mogła prawidłowo wykonać pracę. Gdy zadanie zostanie wykonane, użyj obiektu Network zwróconego przez JobParameters.getNetwork(). W przeciwnym razie będziesz niejawnie korzystać z domyślnej sieci urządzenia, która może nie spełniać Twoich wymagań i powodować niezamierzone zużycie danych.

Neural Networks API 1.1

Interfejs Neural Networks API został wprowadzony w Androidzie 8.1 (API na poziomie 27), aby przyspieszyć uczenie maszynowe na urządzeniach z Androidem. Android 9 rozszerza 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 na Androidzie 9 i nowszych, dane wyjściowe z NNAPI mogą nie odpowiadać danym wyjściowym z frameworków uczenia maszynowego wyższego poziomu, takich jak TensorFlow Lite. Zamiast tego przesyłaj tylko ANEURALNETWORKS_TENSOR_FLOAT32, dopóki problem nie zostanie rozwiązany.

Dodatkowo interfejs API wprowadza nową funkcję ANeuralNetworksModel_relaxComputationFloat32toFloat16(), która pozwala określić, czy obliczać ANEURALNETWORKS_TENSOR_FLOAT32 z zakresem i precyzją tak niskimi jak w przypadku 16-bitowego formatu zmiennoprzecinkowego 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 podczas wypełniania formularzy. Więcej informacji o korzystaniu z funkcji autouzupełniania w aplikacji znajdziesz w przewodniku Autofill Framework (w języku angielskim).

Ulepszenia zabezpieczeń

Android 9 wprowadza wiele funkcji zabezpieczeń, które podsumowano w sekcjach poniżej:

Zabezpieczone potwierdzenie w Androidzie

Na obsługiwanych urządzeniach z Androidem 9 lub nowszym możesz korzystać z potwierdzenia chronionego przez Androida. W tym procesie aplikacja wyświetla użytkownikowi prompt z prośbą o zatwierdzenie krótkiego oświadczenia. To oświadczenie pozwala aplikacji potwierdzić, że użytkownik chce dokonać transakcji wymagającej szczególnej ostrożności, np. płatności.

Jeśli użytkownik zaakceptuje oświadczenie, usługa Android Keystore otrzyma i zapisze podpis kryptograficzny chroniony przez kod uwierzytelniający wiadomości przy użyciu wartości hash (HMAC) w formie kluczy. Gdy usługa Android Keystore potwierdzi ważność wiadomości, aplikacja może użyć klucza wygenerowanego na podstawie trustedConfirmationRequired w zaufanym środowisku wykonawczym (TEE) do podpisania wiadomości zaakceptowanej przez użytkownika. Podpis z dużą dozą pewności wskazuje, że użytkownik zapoznał się z oświadczeniem i je zaakceptował.

Ostrzeżenie: potwierdzenie chronione na Androidzie nie zapewnia użytkownikowi bezpiecznego kanału informacji. Aplikacja nie może zakładać żadnych gwarancji poufności poza tymi, które oferuje platforma Android. W szczególności nie używaj tego procesu do wyświetlania informacji poufnych, których zwykle nie pokazujesz na urządzeniu użytkownika.

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

Ujednolicone okno uwierzytelniania biometrycznego

W Androidzie 9 system wyświetla okna uwierzytelniania biometrycznego w imieniu aplikacji. Ta funkcja zapewnia standardowy wygląd, działanie i umiejscowienie okna, dzięki czemu użytkownicy mają większą pewność, że uwierzytelniają się za pomocą zaufanego narzędzia do sprawdzania danych biometrycznych.

Jeśli Twoja aplikacja używa FingerprintManager do wyświetlania użytkownikom okna uwierzytelniania odciskiem palca, zacznij używać BiometricPrompt zamiast niego. BiometricPrompt polega na wyświetlaniu okna uwierzytelniania przez system. Zmienia też swoje działanie, aby dostosować się do wybranego przez użytkownika rodzaju uwierzytelniania biometrycznego.

.

Moduł zabezpieczeń sprzętowych

Na obsługiwanych urządzeniach z Androidem 9 lub nowszym może być zainstalowany KeyMint (wcześniej Keymaster) StrongBox, czyli implementacja interfejsu HAL KeyMint (wcześniej Keymaster) znajdująca się w sprzętowym module zabezpieczeń. Moduł zawiera:

  • własny procesor,
  • Bezpieczne przechowywanie.
  • prawdziwy generator liczb losowych,
  • Dodatkowe mechanizmy zapobiegające nieuprawnionym modyfikacjom pakietów i instalowaniu aplikacji z zewnętrznych źródeł.

Podczas sprawdzania kluczy przechowywanych w StrongBox KeyMint system potwierdza integralność klucza w zaufanym środowisku wykonawczym (TEE).

Więcej informacji o używaniu StrongBox KeyMint znajdziesz w sekcji Moduł zabezpieczeń sprzętowych.

Bezpieczne importowanie klucza do magazynu kluczy

Android 9 zapewnia dodatkowe zabezpieczenia odszyfrowywania kluczy, ponieważ umożliwia bezpieczne importowanie zaszyfrowanych kluczy do magazynu kluczy za pomocą formatu klucza zakodowanego w ASN.1. Następnie KeyMint odszyfrowuje klucze w Keystore, dzięki czemu zawartość kluczy nigdy nie pojawia się w pamięci hosta urządzenia w postaci zwykłego tekstu.

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

Schemat podpisu plików APK z rotacją kluczy

Android 9 obsługuje schemat podpisu plików APK w wersji 3. Ten schemat umożliwia uwzględnienie w bloku podpisu rekordu potwierdzającego rotację dla każdego certyfikatu podpisu. Ta funkcja umożliwia podpisanie aplikacji nowym certyfikatem podpisywania przez powiązanie poprzednich certyfikatów podpisywania pliku APK z certyfikatem, którym jest on teraz podpisany.

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

Opcja zezwalania na odszyfrowywanie klucza tylko na odblokowanych urządzeniach

W Androidzie 9 wprowadzono flagę unlockedDeviceRequired. Ta opcja określa, czy przed zezwoleniem na odszyfrowanie danych przesyłanych lub przechowywanych przy użyciu określonego klucza magazyn kluczy wymaga odblokowania ekranu. Te typy kluczy doskonale nadają się do szyfrowania poufnych danych, takich jak dane dotyczące zdrowia lub dane firmowe, które mają być przechowywane na dysku. Flaga zapewnia użytkownikom większą pewność, że dane nie mogą zostać odszyfrowane, gdy urządzenie jest zablokowane, w przypadku zgubienia lub kradzieży telefonu.

Aby zabezpieczyć klucz przed odszyfrowaniem, gdy urządzenie jest zablokowane, włącz flagę, przekazując wartość true do metody setUnlockedDeviceRequired(). Po wykonaniu tego kroku, gdy ekran użytkownika jest zablokowany, wszelkie próby odszyfrowania lub podpisania danych za pomocą tego klucza nie powiodą się. Aby uzyskać dostęp do zablokowanego urządzenia, musisz podać kod PIN, hasło, odcisk palca lub inny zaufany czynnik.

Obsługa starszego szyfrowania

Urządzenia z Androidem 9, które są dostarczane z Keymasterem 4, obsługują algorytm Triple Data Encryption Algorithm, czyli Triple DES. Jeśli Twoja aplikacja współpracuje ze starszymi systemami, które wymagają algorytmu Triple DES, używaj tego typu 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

Funkcja WPS została wycofana ze względów bezpieczeństwa.

Kopie zapasowe Androida

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

kopie zapasowe szyfrowane po stronie klienta,

Android 9 umożliwia szyfrowanie kopii zapasowych Androida z użyciem zabezpieczenia po stronie klienta. Ta funkcja jest włączana automatycznie, gdy spełnione są te warunki:

Gdy to zabezpieczenie prywatności jest włączone, do przywrócenia danych z kopii zapasowych utworzonych na urządzeniu użytkownika wymagany jest kod PIN, wzór lub hasło urządzenia. Więcej informacji o technologii, która stoi za tą funkcją, znajdziesz w dokumencie Google Cloud Key Vault Service.

Określanie warunków, które muszą być spełnione na urządzeniu, aby można było utworzyć kopię zapasową

Jeśli dane aplikacji zawierają informacje lub preferencje o charakterze poufnym, Android 9 umożliwia określenie warunków urządzenia, w których dane aplikacji są uwzględniane w kopii zapasowej użytkownika, np. gdy włączone jest szyfrowanie po stronie klienta lub gdy odbywa się lokalne przesyłanie danych z urządzenia na urządzenie.

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 w zakresie ułatwień dostępu, które pozwalają zapewnić użytkownikom aplikacji jeszcze lepsze wrażenia.

Semantyka nawigacji

Atrybuty dodane w Androidzie 9 ułatwiają określanie, w jaki sposób usługi ułatwień dostępu, zwłaszcza czytniki ekranu, poruszają się po ekranie. Te atrybuty mogą pomóc użytkownikom z wadami wzroku szybko poruszać się po tekście w interfejsie aplikacji i dokonywać wyboru.

Na przykład w aplikacji zakupowej czytnik ekranu może pomóc użytkownikom w przechodzeniu bezpośrednio z jednej kategorii ofert do drugiej bez konieczności odczytywania wszystkich elementów w kategorii przed przejściem do następnej.

Tytuły paneli ułatwień dostępu

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

W Androidzie 9 możesz podać tytuły paneli ułatwień dostępu lub tytuły, które można indywidualnie zidentyfikować. Jeśli panel ma tytuł panelu ułatwień dostępu, usługi ułatwień dostępu otrzymują bardziej szczegółowe informacje, gdy panel się zmienia. Ta funkcja umożliwia usługom przekazywanie użytkownikowi bardziej szczegółowych informacji 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ępowany w czasie działania programu, za pomocą funkcji 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 atrybut android:accessibilityHeading na wartość true w przypadku wystąpień 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 od jednego nagłówka do drugiego. Każda usługa ułatwień dostępu może korzystać z tej funkcji, aby zwiększyć komfort nawigacji po interfejsie.

Nawigacja i generowanie mowy w grupach

Czytniki ekranu tradycyjnie używają atrybutu android:focusable, aby określić, kiedy powinny odczytywać element ViewGroup lub kolekcję obiektów View jako pojedynczą jednostkę. Dzięki temu użytkownicy będą wiedzieć, że widoki są ze sobą logicznie powiązane.

W Androidzie 8.1 i starszych musisz oznaczyć każdy obiekt ViewViewGroup jako nieprzeznaczony do zaznaczania, a sam element ViewGroup jako przeznaczony do zaznaczania. W niektórych przypadkach powodowało to, że element View był oznaczany jako element, na którym można ustawić fokus, co utrudniało nawigację za pomocą klawiatury.

Od Androida 9 możesz używać atrybutu android:screenReaderFocusable zamiast atrybutu android:focusable w sytuacjach, w których ustawienie obiektu View jako elementu, na którym można ustawić fokus, ma niepożądane konsekwencje. Czytniki ekranu zaznaczają wszystkie elementy, w których atrybut android:screenReaderFocusable lub android:focusable ma wartość true.

Wygodne działania

Android 9 umożliwia wykonywanie działań w imieniu użytkowników:

Interakcja z etykietkami
Dodane funkcje w platformie ułatwień dostępu zapewniają dostęp do dymków w interfejsie aplikacji. Użyj getTooltipText(), aby odczytać tekst etykietki, oraz ACTION_SHOW_TOOLTIPACTION_HIDE_TOOLTIP, aby poinstruować instancje View, aby wyświetlały lub ukrywały etykietki.
Dodano działania globalne
Android 9 wprowadza obsługę 2 dodatkowych działań na urządzeniu w klasie AccessibilityService Usługa może pomagać użytkownikom w blokowaniu urządzeń i robieniu zrzutów ekranu za pomocą działań GLOBAL_ACTION_LOCK_SCREENGLOBAL_ACTION_TAKE_SCREENSHOT.

Szczegóły zmiany okna

Android 9 ułatwia śledzenie aktualizacji okien aplikacji, gdy aplikacja ponownie rysuje wiele okien jednocześnie. Gdy wystąpi zdarzenieTYPE_WINDOWS_CHANGED, użyj interfejsu APIgetWindowChanges(), aby określić, jak zmieniły się okna. Podczas aktualizacji w wielu oknach każde okno generuje własny zestaw zdarzeń. getSource() Metoda zwraca widok główny okna powiązanego z każdym zdarzeniem.

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

Obrót

Aby wyeliminować przypadkowe obracanie, dodaliśmy tryb, który blokuje bieżącą orientację nawet wtedy, gdy pozycja urządzenia się zmieni. Użytkownicy mogą w razie potrzeby ręcznie wywołać obracanie, 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 zachowanie związane z obracaniem ekranu lub używa nietypowych ustawień orientacji ekranu, możesz napotkać problemy, które wcześniej byłyby niezauważalne, gdy preferencje użytkownika dotyczące obracania ekranu były zawsze ustawione na orientację pionową. Zachęcamy do sprawdzenia zachowania rotacji we wszystkich kluczowych aktywnościach aplikacji i upewnienia się, że wszystkie ustawienia orientacji ekranu nadal zapewniają optymalne wrażenia.

Więcej informacji znajdziesz w artykule o zmianach w zachowaniu.

obracanie urządzenia mobilnego z nowym trybem obracania, który umożliwia użytkownikom ręczne wywoływanie obracania;

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

Tekst

Android 9 wprowadza na platformę te funkcje związane z tekstem:

  • Wstępnie obliczony tekst: klasa PrecomputedText zwiększa wydajność renderowania tekstu, umożliwiając wcześniejsze obliczanie i buforowanie wymaganych informacji. Umożliwia też aplikacji wykonywanie układu tekstu poza głównym wątkiem.

  • Lupa: klasa Magnifier to widżet platformy, który udostępnia interfejs API lupy, co pozwala na spójne korzystanie z funkcji lupy we wszystkich aplikacjach.

  • Inteligentne linkowanie: Android 9 rozszerza klasę TextClassifier, która wykorzystuje uczenie maszynowe do rozpoznawania niektórych encji w wybranym tekście i sugerowania działań. Na przykład TextClassifier może umożliwić aplikacji wykrycie, że użytkownik wybrał numer telefonu. Aplikacja może wtedy zasugerować użytkownikowi wykonanie połączenia telefonicznego przy użyciu tego numeru. Funkcje w TextClassifier zastępują funkcjonalność klasy Linkify.

  • Układ tekstu: kilka wygodnych metod i atrybutów ułatwia implementację projektu interfejsu. Szczegółowe informacje znajdziesz w dokumentacji referencyjnej dotyczącej TextView.

Konwersja plików DEX z wyprzedzeniem w ART

Na urządzeniach z Androidem 9 lub nowszym kompilator ART (Android Runtime) dodatkowo optymalizuje skompresowane pliki wykonywalne Dalvik (DEX), przekształcając je w bardziej kompaktową postać. Dzięki tej zmianie aplikacja będzie się szybciej uruchamiać i zajmować mniej miejsca na dysku oraz pamięci RAM.

Ta zmiana jest szczególnie korzystna w przypadku urządzeń z niższej półki, które mają wolniejsze prędkości wejścia/wyjścia dysku.

Śledzenie systemu na urządzeniu

Android 9 umożliwia nagrywanie śladów systemowych na urządzeniu, a następnie udostępnianie raportu z tymi nagraniami zespołowi deweloperów. Ten raport obsługuje wiele formatów, w tym HTML.

Zbierając te ślady, możesz rejestrować dane o czasie związane z procesami i wątkami aplikacji oraz wyświetlać inne rodzaje stanów urządzenia o znaczeniu globalnym.

Więcej informacji o tym narzędziu znajdziesz w artykule Przeprowadzanie śledzenia systemu na urządzeniu.