Funkcje i interfejsy API Androida 9

Android 9 (poziom interfejsu API 28) wprowadza nowe funkcje i możliwości dla użytkowników i programistów. Ten dokument zawiera informacje o nowościach dla deweloperów.

Więcej informacji o nowych interfejsach API znajdziesz w raportów o różnicach między interfejsami API lub Dokumentacja API na Androida. Zapoznaj się też ze zmianami w zachowaniu Androida 9, aby dowiedzieć się, w jakich obszarach zmiany w systemie mogą wpłynąć na Twoje aplikacje.

Pozycjonowanie we wnętrzach z Wi-Fi RTT

Nowe interfejsy RTT obsługują pozycjonowanie wewnątrz budynków w aplikacjach.

Android 9 obsługuje platformę Wi-Fi zgodnie ze standardem IEEE 802.11-2016 protokołu RTT, znanego też jako Wi-Fi Round-Trip-Time (Czas błądzenia Wi-Fi), który zapewnia pozycjonowania wnętrz w aplikacjach.

Na urządzeniach z Androidem 9 z obsługą sprzętową aplikacje mogą używać za pomocą interfejsów RTT API do pomiaru odległość do pobliskich punktów dostępu Wi-Fi obsługujących RTT. Na urządzeniu muszą być włączone usługi lokalizacyjne i skanowanie sieci Wi-Fi (w sekcji Ustawienia > 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ślać odległość do punktu dostępu. Punkty dostępu nie mają dostępu do tych informacji.

Jeśli urządzenie mierzy odległość co najmniej 3 punktów dostępu, możesz użyć algorytm powielania w celu oszacowania pozycji urządzenia, która najlepiej do niej pasuje. pomiarów. Wynik jest zwykle dokładny do 1–2 metrów.

Dzięki tej dokładności możesz tworzyć nowe funkcje, takie jak nawigacja wewnątrz budynku oraz szczegółowe 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 na ten produkt?”).

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

Więcej informacji: Lokalizacja Wi-Fi: zakres RTT.

Obsługa wycięcia w ekranie

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

Testowanie wycięcia ekranu za pomocą emulatora

Android 9 obsługuje najnowsze ekrany o szerokim zakresie z wycięciami w ekranach pod kątem kamer i głośników. DisplayCutout pozwala ustalić położenie i kształt niedziałających obszarów, nie powinny się wyświetlać. Aby określić, czy i gdzie znajdują się te wycięte obszary, użyj metody getDisplayCutout().

Nowy atrybut układu okna, layoutInDisplayCutoutMode, pozwala aplikacji rozmieszczać treści wokół wycięć na urządzeniu. Możesz ustawić ten atrybut na jedną z tych wartości:

Możesz symulować wycięcie w ekranie na dowolnym urządzeniu lub w emulatorze z Androidem 9. w następujący 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ń powiadomień, które są dostępne dla deweloperów kierujących aplikacje na interfejs API na poziomie 28 lub nowszym.

Powiadomienia o wiadomościach

MessagingStyle z załączonym zdjęciem.

Powiadomienie o wiadomości

MessagingStyle z odpowiedziami i rozmowami.

Przykładowy kod, który korzysta z powiadomień, w tym funkcji Androida 9, znajdziesz tutaj Osoby Fragment.

Ulepszone przesyłanie wiadomości

Począwszy od Androida 7.0 (interfejs API na poziomie 24), możesz dodać działanie, aby odpowiedzieć na wiadomości lub wpisać inny tekst bezpośrednio z powiadomienia. Android 9 ulepsza tę funkcję, wprowadzając następujące ulepszenia:

  • Uproszczone wsparcie dla uczestników rozmowy: klasa Person służy do identyfikowania osób biorących udział w rozmowie, w tym ich awatarów i identyfikatorów URI. Wiele innych interfejsów API, np. addMessage(), korzysta teraz z klasy Person zamiast CharSequence. Zajęcia: Person obsługuje też wzorzec projektowy konstruktora.

  • Obsługa obrazów: Android 9 wyświetla obrazy w powiadomieniach o wiadomościach na telefonach. Za pomocą setData() w wiadomości, aby wyświetlić obraz. Fragment kodu poniżej pokazuje, aby utworzyć obiekt 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);
  • Zapisuj odpowiedzi jako wersje robocze: aplikacja może pobierać EXTRA_REMOTE_INPUT_DRAFT wysyłane przez system, gdy użytkownik przypadkowo zamknie powiadomienie o wiadomości. Możesz użyć tej funkcji, aby wstępnie wypełnić pola tekstowe w aplikacji, dzięki czemu użytkownicy będą mogli dokończyć swoją odpowiedź.

  • Określanie, czy rozmowa jest rozmową grupową: za pomocą setGroupConversation() aby celowo określić wątek jako rozmowę grupową lub niegrupową.

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

  • Inteligentna odpowiedź: Android 9 obsługuje te same sugerowane odpowiedzi, które są dostępne w aplikacji do obsługi wiadomości. Użyj opcji RemoteInput.setChoices(), aby wyświetlić użytkownikowi zestaw standardowych odpowiedzi.

Ustawienia kanału, komunikaty i tryb Nie przeszkadzać

W Androidzie 8.0 wprowadzono kanały powiadomień, które umożliwiają tworzenie kanałów dostępnych dla użytkownika dla każdego typu powiadomienia, 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ń aplikacji. Możesz użyć metody isBlocked(), aby określić, kiedy grupa jest zablokowana i w efekcie nie wysyłaj żadnych powiadomień dla kanałów w tej grupie.

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

  • Nowe typy intencji transmisji: system Android wysyła intencje transmisji gdy zmieni się stan blokowania kanałów powiadomień i grup kanałów. Aplikacja będąca właścicielem zablokowanego kanału lub grupy może nasłuchiwać tych intencji i odpowiednio zareagować. Więcej informacji o tych działaniach i dodatkowych działaniach znajdziesz na zaktualizowanej liście stałych w dokumentacji NotificationManager. Informacje o reagowaniu na intencje dotyczące transmisji znajdziesz w artykule Transmisje.

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

  • NotificationManager.Policy zawiera też 7 nowych stałych wartości trybu Nie przeszkadzać, których możesz użyć do wyciszenia wizualnych przerw:

Obsługa wielu kamer i aktualizacje dotyczące ich działania

Na urządzeniach z Androidem 9 możesz uzyskać 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órych nie można uzyskać za pomocą pojedynczego aparatu, takie jak płynne przybliżanie, efekt bokeh i stereoskopia. Interfejs API umożliwia też wywoływanie transmisji z kamery, która automatycznie przełącza się między co najmniej 2 kamerami.

Inne ulepszenia w kamerze to dodatkowe parametry sesji, które pomagają zmniejszyć opóźnienia podczas początkowego przechwytywania, oraz udostępnianie powierzchni, które pozwala klientom kamery obsługiwać różne przypadki użycia bez konieczności zatrzymywania i rozpoczynania strumieniowego przesyłania kamery. Dodaliśmy też interfejsy API do obsługi flasha na wyświetlaczu oraz dostęp do oznacznień czasu OIS na potrzeby stabilizacji obrazu i efektów specjalnych na poziomie aplikacji.

W Androidzie 9 wielo aparatów Interfejs API obsługuje kamery monochromatyczne na urządzeniach FULL lub LIMITED. Dane wyjściowe monochromatyczne są uzyskiwane za pomocą formatu YUV_420_888z wartością Y jako szarości, U (Cb) jako 128 i V (Cr) jako 128.

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

ImageDecoder do elementów rysowalnych i map bitowych

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

ImageDecoder umożliwia utworzenie Drawable lub Bitmap z bufora bajtów, pliku lub identyfikatora URI. Aby zdekodować obraz, najpierw wywołaj createSource() ze źródłem zakodowanego obrazu. Następnie zadzwoń decodeDrawable() lub decodeBitmap() przez zaliczenie ImageDecoder.Source aby utworzyć obiekt Drawable lub Bitmap. Aby zmienić domyślne ustawienia, prześlij wartość OnHeaderDecodedListener do decodeDrawable() lub decodeBitmap(). ImageDecoder wywołuje onHeaderDecoded() z domyślną szerokością i wysokością obrazu, gdy są znane. Jeśli zakodowany obraz jest animowanym GIF-em lub plikiem WebP, funkcja decodeDrawable() zwraca obiekt Drawable będący instancją klasy AnimatedImageDrawable.

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

  • Aby przeskalować zdekodowany obraz do określonego rozmiaru, przekaż wymiary docelowe do setTargetSize() Możesz też skalować obrazy, używając rozmiaru próbki. Przekaż wielkość próbki bezpośrednio do: setTargetSampleSize()
  • Aby przyciąć obraz w zakresie powiększonego obrazu, wywołaj funkcję setCrop().
  • Aby utworzyć zmienną bitową, przekaż obiekt true do setMutableRequired()

ImageDecoder umożliwia też dodawanie do obrazu niestandardowych i skomplikowanych efektów takich jak zaokrąglone rogi, w postaci kół. Używaj setPostProcessor() z instancją PostProcessor do wykonywania dowolnych poleceń rysowania.

Animacja

Android 9 wprowadza klasę AnimatedImageDrawable do rysowania i wyświetlania animowanych obrazów GIF i WebP. AnimatedImageDrawable działa podobnie do AnimatedVectorDrawable, ponieważ wątki renderowania sterują animacjami AnimatedImageDrawable. Do dekodowania wątku renderowania służy też wątek roboczy, dzięki czemu dekodowanie nie zakłóca innych operacji na wątku renderowania. Ta implementacja umożliwia wyświetlanie w aplikacji animowanego obrazu bez zarządzania jej aktualizacjami lub ingerencję w inne zdarzenia w wątku interfejsu aplikacji.

AnimatedImageDrawable można zdekodować za pomocą instancji ImageDecoder Poniżej fragment kodu pokazuje, jak za pomocą parametru ImageDecoder zdekodować 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ą dalszą modyfikację obrazu. Na przykład możesz użyć atrybutu setPostProcessor() zmienić wygląd zdjęcia, na przykład zastosować okrągłą maskę lub lub zaokrąglonych rogów.

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

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

Android 9 obsługuje też kodowanie obrazów za pomocą formatu pliku obrazu o wysokiej efektywności (HEIF lub HEIC), który zapewnia lepszą kompresję oraz zmniejsza zużycie miejsca na dane i danych sieciowych. Przykłady nieruchomych obrazów HEIF są obsługiwane w MediaMuxer i MediaExtractor zajęcia. Dzięki obsłudze platformy na urządzeniach z Androidem 9 możesz łatwo wysyłać używać obrazów HEIF z serwera backendu. Gdy upewnisz się, że atrybuty aplikacja jest zgodna z tym formatem danych do udostępniania i wyświetlania, wypróbuj HEIF jako format zapisu obrazów w aplikacji. możesz przekonwertować plik JPEG na heic; przy użyciu ImageDecoder lub BitmapFactory (która uzyskuje bitmapy z pliku JPEG). Następnie możesz użyć HeifWriter, aby zapisać HEIF nieruchome obrazy z buforów bajtowych YUV oraz przypadki Surface lub Bitmap.

Dane o mediach są też dostępne w klasach AudioTrack, AudioRecordMediaDrm.

Android 9 wprowadza metody Klasa MediaDRM do pobierania danych, HDCP poziom bezpieczeństwa, liczbę sesji i większą kontrolę nad poziomymi zabezpieczeń i zabezpieczeniami. Szczegółowe informacje znajdziesz w raporcie różnic między wersjami interfejsu API.

W Androidzie 9 interfejs AAudio obsługuje kilka dodatkowych atrybutów AAudioStream, w tym użycie, typ treści i wstępny zestaw ustawień wejścia. Za pomocą tych atrybutów możesz tworzyć strumienie, do obsługi VoIP lub kamery. Możesz też ustawić identyfikator sesji, aby powiązać strumień AAudio z submiksem, który może zawierać efekty. Użyj AudioEffect API do sterowania efekty.

Android 9 wprowadza interfejs API AudioEffect do przetwarzania dynamiki. Dzięki tym lekcjom możesz tworzyć efekty dźwiękowe na kanale, w tym: korekcję, kompresję wielozakresową i ogranicznik – na wielu etapach. Liczba pasm i aktywnych etapów jest konfigurowalna, a większość parametrów można kontrolować w czasie rzeczywistym.

Poufność kosztów danych w harmonogramie zadań

Od Androida 9 JobScheduler może wykorzystać sygnały stanu sieci dostarczane przez operatorów do poprawy obsługi zadań związanych z siecią.

Zadania mogą deklarować szacowany rozmiar danych, pobieranie wstępnie sygnału i szczegółowe wymagania dotyczące sieci. JobScheduler zarządza pracą zgodnie z stan sieci. Jeśli na przykład sieć sygnalizuje, że jest przeciążona, JobScheduler może odłożyć na później duże żądania sieciowe. W sieci bez limitu danych JobScheduler może uruchamiać zadania wstępnego pobierania, aby poprawić wrażenia użytkownika, np. poprzez wstępne pobieranie nagłówków.

Podczas dodawania zadań pamiętaj, aby w odpowiednich przypadkach użyć tagów setEstimatedNetworkBytes(), setPrefetch()setRequiredNetwork(), aby ułatwić JobScheduler prawidłowe wykonywanie pracy. Gdy zadanie jest wykonywane, pamiętaj, aby użyć obiektu Network zwrócone przez JobParameters.getNetwork() W przeciwnym razie domyślnie skorzystasz z domyślnej sieci urządzenia, może nie spełniać Twoich wymagań, co spowoduje niezamierzone użycie danych.

Neural Networks API 1.1

W Androidzie 8.1 (poziom interfejsu API 27) wprowadzono interfejs API sieci neuronowych, aby przyspieszyć działanie systemów uczących się na urządzeniach z Androidem. Android 9 rozszerza i ulepsza interfejs API, dodając obsługę 9 nowych operacji:

Znany problem: Po zdaniu testu ANEURALNETWORKS_TENSOR_QUANT8_ASYMM tensorów do potęgi ANEURALNETWORKS_PAD jest dostępna w Androidzie 9 i nowszych, dane wyjściowe z NNAPI mogą nie być zgodne z danymi wyjściowymi maszyny wyższego poziomu struktury nauczania, takie jak TensorFlow Lite – Zamiast tego prześlij tylkoANEURALNETWORKS_TENSOR_FLOAT32do czasu rozwiązania problemu.

Interfejs API wprowadza też nową funkcję ANeuralNetworksModel_relaxComputationFloat32toFloat16(), która pozwala określić, czy obliczenia ANEURALNETWORKS_TENSOR_FLOAT32 mają być wykonywane z zakresem i dokładnością tak niską jak w przypadku formatu IEEE 754 16-bitowego zmiennoprzecinkowego.

Platforma autouzupełniania

Android 9 wprowadza wiele ulepszeń, które usługi autouzupełniania mogą zaimplementować, aby jeszcze bardziej ulepszyć wrażenia użytkowników podczas wypełniania formularzy. Aby dowiedzieć się więcej o korzystaniu z funkcji autouzupełniania w aplikacji, przeczytaj Przewodnik po platformie autouzupełniania.

Ulepszenia zabezpieczeń

Android 9 wprowadza szereg funkcji zabezpieczeń, które podsumowują te sekcje:

Zabezpieczone potwierdzenie w Androidzie

Obsługiwane urządzenia z Androidem w wersji 9 lub nowszej umożliwiają korzystanie z potwierdzenia chronionego przez Androida. Podczas korzystania z tego procesu aplikacja wyświetla użytkownikowi prośbę o zatwierdzenie krótkiej informacji. To oświadczenie umożliwia aplikacji potwierdzenie, że użytkownik chce ukończyć poufne transakcje, takie jak dokonywanie płatności.

Jeśli użytkownik zaakceptuje oświadczenie, Keystore Androida otrzyma i zapisze podpis kryptograficzny chroniony kodem uwierzytelniania wiadomości za pomocą wartości hash (HMAC). Gdy Android Keystore potwierdzi ważność wiadomości, aplikacja może użyć klucza wygenerowanego z trustedConfirmationRequired w środowisku zaufanego wykonywania (TEE), aby podpisać wiadomość zaakceptowaną przez użytkownika. wskazuje z dużą pewnością, że użytkownik widział oświadczenia i użytkownik się na nie zaakceptował.

Uwaga: Bezpieczne potwierdzenie na Androidzie nie udostępnia bezpiecznego kanału informacyjnego użytkownika. Aplikacja nie może zapewniać żadnych gwarancji poufności wykraczających poza te, które oferuje platforma Android. W szczególności nie używaj tego procesu do wyświetlania informacji poufnych, których nie wyświetlasz zwykle na urządzeniu użytkownika.

Wskazówki dotyczące dodawania obsługi potwierdzenia w Androidzie znajdziesz tutaj: Ochrona Androida Potwierdzenie Google.

Okno uwierzytelniania biometrycznego

W Androidzie 9 system wyświetla w imieniu aplikacji okno uwierzytelniania biometrycznego. Dzięki tej funkcji okno ma ujednolicony wygląd i umiejscowienie, co daje użytkownikom większą pewność, że uwierzytelniają się za pomocą zaufanej funkcji sprawdzania danych biometrycznych.

Jeśli Twoja aplikacja używaFingerprintManagerdo wyświetlania użytkownikom okna uwierzytelniania odciskiem palca, zamiast tego użyjBiometricPrompt. Do wyświetlania uwierzytelniania BiometricPrompt używa systemu . Zmienia się również sposób działania, aby dostosować się do typu biometrii wybrane przez użytkownika.

Moduł zabezpieczeń sprzętowych

Obsługiwane urządzenia z Androidem 9 lub nowszym mogą mają StrongBox Keymaster, czyli implementację interfejsu HAL Keymaster, znajduje się w sprzętowym module zabezpieczeń. Moduł obejmuje:

  • własny procesor;
  • Bezpieczne miejsce na dane.
  • Prawdziwy generator liczb losowych.
  • dodatkowe mechanizmy zapobiegające modyfikowaniu pakietów i nieautoryzowanemu instalowaniu aplikacji;

Podczas sprawdzania kluczy przechowywanych w StrongBox Keymaster systemie system potwierdza jego integralność w Trusted Execution Environment (TEE).

Więcej informacji o używaniu Strongbox Keymaster znajdziesz w artykule Sprzętowy moduł zabezpieczeń.

Bezpieczne importowanie klucza do magazynu kluczy

Android 9 zapewnia dodatkową ochronę kluczy odszyfrowywania dzięki możliwości bezpiecznego importowania zaszyfrowanych kluczy do Keystore za pomocą formatu klucza ASN.1. Następnie Keymaster odszyfrowuje klucze w Keystore, dzięki czemu ich zawartość nigdy nie pojawia się w postaci zwykłego tekstu w pamięci hosta urządzenia.

Dowiedz się więcej o importowaniu zaszyfrowanych kluczy bezpieczeństwa.

Schemat podpisu pliku APK z rotacją klucza

Android 9 obsługuje schemat podpisu plików APK w wersji 3. W ramach tego schematu można dołączyć rekord dowodu rotacji w bloku podpisywania w przypadku każdego certyfikatu podpisywania. Ta funkcja umożliwia podpisywanie aplikacji nowym podpisywaniem certyfikat, łącząc poprzednie certyfikaty podpisywania pliku APK z certyfikatem który został podpisany.

Dowiedz się więcej o tym, jak wykonywać rotację kluczy za pomocą apksigner.

Opcja zezwalania na odszyfrowywanie klucza tylko na odblokowanych urządzeniach

Android 9 wprowadza flagę unlockedDeviceRequired. Ta opcja określa, czy Keystore wymaga odblokowania ekranu, zanim zezwoli na odszyfrowanie danych w transmisji lub zapisanych za pomocą określonego klucza. Te typy kluczy są odpowiednie do szyfrowania danych poufnych, które mają być przechowywane na dysku, takich jak dane medyczne lub dane firmowe. Flaga zapewnia użytkownikom większe bezpieczeństwo, ponieważ w przypadku zgubienia lub kradzieży telefonu dane nie mogą zostać odszyfrowane, gdy urządzenie jest zablokowane.

Aby klucz nie został odszyfrowany, gdy urządzenie jest zablokowane, włącz flagę przekazując true do funkcji setUnlockedDeviceRequired() . Po wykonaniu tej czynności i zablokowaniu ekranu próba odszyfrowania lub podpisania danych przy użyciu tego klucza zakończy się niepowodzeniem. Zablokowane urządzenie wymaga: kod PIN, hasło, odcisk palca lub inny zaufany czynnik dostęp.

Obsługa starszych wersji szyfrowania

Urządzenia z Androidem 9 dostarczane z systemem Keymaster 4 obsługują dane potrójne Encryption Algorithm, czyli Triple DES, Jeśli Twoja aplikacja współpracuje z systemami starszymi, które wymagają szyfrowania Triple DES, użyj tego typu szyfrowania podczas szyfrowania poufnych danych logowania.

Więcej informacji o zwiększaniu bezpieczeństwa aplikacji znajdziesz w artykule Bezpieczeństwo na Androidzie dla programistów.

Wycofanie WPS

Bezpieczna konfiguracja Wi-Fi (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 dalszej części tego artykułu. sekcji.

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łączona automatycznie, gdy: są spełnione warunki:

Gdy te zabezpieczenia są włączone, kod PIN, wzór lub hasło urządzenia jest jest wymagane do przywrócenia danych z kopii zapasowych utworzonych przez urządzenie użytkownika. Więcej informacji o technologii, na której opiera się ta funkcja, znajdziesz w dokumentacji Google Cloud Key Vault Service.

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

Jeśli dane aplikacji zawierają poufne informacje lub ustawienia, Android 9 pozwala zdefiniować urządzenie , w których przypadku gdy dane aplikacji są uwzględniane w kopii zapasowej użytkownika, np. gdy dane po stronie klienta włączone jest szyfrowanie lub jest przeprowadzany lokalny transfer między urządzeniami.

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

Ułatwienia dostępu

Android 9 wprowadza ulepszenia ułatwień dostępu które ułatwiają udostępnianie użytkownikom do aplikacji.

Semantyka nawigacji

Atrybuty dodane w Androidzie 9 ułatwiają określanie, usługi ułatwień dostępu, zwłaszcza czytniki ekranu, przechodzą z jednej części do innego ekranu. Te atrybuty mogą pomóc użytkownikom z wadą wzroku szybko poruszać się po tekście w interfejsie aplikacji i umożliwiać dokonanie wyboru.

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

Tytuły panelu ułatwień dostępu

W Androidzie 8.1 (poziom interfejsu API 27) i starszych usługa ułatwień dostępu nie zawsze może określić, kiedy została zaktualizowana konkretna część ekranu, np. gdy aktywność zastąpiła 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 określać tytuły paneli ułatwień dostępu, a także pojedynczo łatwe do zidentyfikowania tytuły. Jeśli panel ma tytuł dotyczący 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 dostarczanie użytkownikowi bardziej szczegółowych informacji o zmianach w interfejsie.

Aby podać tytuł panelu, użyj android:accessibilityPaneTitle . Możesz też zaktualizować tytuł panelu interfejsu, który jest zastępowany w czasie wykonywania za pomocą elementu setAccessibilityPaneTitle(). Możesz na przykład podać tytuł obszaru treści witryny, Fragment.

Nawigacja na podstawie nagłówka

Jeśli aplikacja wyświetla treści tekstowe zawierające nagłówki logiczne, ustaw atrybut android:accessibilityHeading na true w przypadku wystąpień atrybutu View, które reprezentują te nagłówki. Dodając te nagłówki, umożliwiasz usługom ułatwień dostępu pomaganie użytkownikom w przechodzenie bezpośrednio z jednego nagłówka do drugiego. Każda usługa ułatwień dostępu może używać tej funkcji, aby ułatwić użytkownikom nawigację po interfejsie.

Wyświetlanie i nawigacja po grupie

Czytniki ekranu tradycyjnie używają android:focusable do określić, kiedy powinni przeczytać ViewGroup lub zbiór View obiektów jako pojedynczą jednostkę. Dzięki temu użytkownicy mogli zrozumieć, że wyświetlenia są ze sobą logicznie powiązane.

W Androidzie 8.1 i starszych musisz oznaczyć każdy obiekt View w ramach ViewGroup jako obiekt, który nie może być zaznaczony, a sam obiekt ViewGroup jako obiekt, który może być zaznaczony. Ten rozmieszczenie sprawiło, że niektóre wystąpienia obiektu View zostały oznaczone jako możliwe do zaznaczenia w taki sposób, korzystanie z nawigacji za pomocą klawiatury stało się niewygodne.

Od Androida 9 możesz używać atrybutu android:screenReaderFocusable zamiast atrybutu android:focusable w sytuacjach, gdy nadanie obiektowi View właściwości focusable powoduje niepożądane konsekwencje. Czytniki ekranu przenieś zaznaczenie na wszystkie elementy, które ustawiły android:screenReaderFocusable lub android:focusable do true.

Działania wygodne

W Androidzie 9 można jeszcze wygodniej wykonywać działania w imieniu użytkowników:

Interakcja z etykietkami
Nowe funkcje ułatwień dostępu dają Ci dostęp do: etykietek w interfejsie aplikacji. Używaj getTooltipText() aby odczytać tekst etykietki, i użyj ACTION_SHOW_TOOLTIP i ACTION_HIDE_TOOLTIP aby instruować instancje View, aby wyświetlały lub ich etykietki.
Dodane działania globalne
Android 9 wprowadza obsługę 2 dodatkowych działań w aplikacji AccessibilityService. zajęcia. Twoja usługa może pomagać użytkownikom w blokowaniu urządzeń i robieniu zrzutów ekranu, odpowiednio za pomocą działań GLOBAL_ACTION_LOCK_SCREENGLOBAL_ACTION_TAKE_SCREENSHOT.

Szczegóły zmiany okna

Android 9 ułatwia śledzenie zmian w oknach aplikacji, gdy aplikacja tworzy wiele okien jednocześnie. Gdy wystąpi zdarzenie TYPE_WINDOWS_CHANGED, użyj interfejsu API getWindowChanges(), aby określić, jak zmieniły się okna. Podczas aktualizacji w trybie wielu okien każde generuje własny zestaw zdarzeń. Metoda getSource() zwraca widok okna skojarzony z każdym zdarzeniem.

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

Obrót

Aby wyeliminować przypadkowe obracanie, dodaliśmy tryb, który blokuje bieżącą orientację nawet wtedy, gdy pozycja urządzenia się zmienia. Użytkownicy mogą aktywować rotację ręcznie, klikając przycisk na pasku systemowym.

W większości przypadków wpływ na zgodność aplikacji jest minimalny. Jeśli jednak aplikacja ma niestandardowe obrót lub używa nietypowej orientacji ekranu; mogą pojawić się problemy, które wcześniej nie były zauważone, ustawienie rotacji użytkowników zawsze było ustawione pionowo. Zachęcamy do sprawdzenia zachowania obracania w przypadku wszystkich kluczowych czynności w aplikacji i upewnienia się, że wszystkie ustawienia orientacji ekranu nadal zapewniają optymalne wrażenia.

Więcej informacji znajdziesz w artykule o związanych zmianach w zachowaniu.

Obrót urządzenia mobilnego z wyświetlonym nowym trybem rotacji, który umożliwia użytkownikom ręczne uruchamianie rotacji

Nowy tryb obracania umożliwia użytkownikom ręczne uruchamianie obracania za pomocą przycisku na pasku systemowym.

Tekst

Android 9 wprowadza te funkcje związane z tekstem platforma:

  • Wyliczony tekst: klasa PrecomputedText poprawia wydajność renderowania tekstu, umożliwiając wcześniejsze obliczenie i zapisanie w pamięci podręcznej wymaganych informacji. Umożliwia też aplikacji wykonywanie układu tekstu poza wątkiem głównym.

  • Magnifier: klasa Magnifier to widżet platformowy, który udostępnia interfejs API Magnifier, zapewniając spójne działanie funkcji powiększania we wszystkich aplikacjach.

  • Inteligentne łączenie: Android 9 ulepsza klasę TextClassifier, która wykorzystuje systemy uczące się do rozpoznawania niektórych encji w wybranym tekście i proponowania działań. Na przykład TextClassifier może umożliwić aplikacji wykrycie, że użytkownik wybrał numer telefonu. Aplikacja może wtedy zasugerować, że użytkownik dzwoni za pomocą tego numeru. Funkcje w TextClassifier zastępują funkcjonalność klasy Linkify.

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

Wcześniejsza konwersja plików DEX w ART

Na urządzeniach z Androidem 9 lub nowszym środowisko wykonawcze Androida Kompilator (ART) wyprzedzający dalszą optymalizację skompresowanego pliku wykonywalnego Dalvik plików DEX, konwertując pliki DEX w pakiecie aplikacji na kompaktową reprezentacją. Ta zmiana umożliwia szybsze uruchamianie aplikacji i korzystanie z niej mniej miejsca na dysku i pamięci RAM.

To ulepszenie dotyczy zwłaszcza urządzeń niskiej klasy z wolniejszym wejściem/wyjściem dysku Szybkość działania.

Śledzenie systemu na urządzeniu

Android 9 pozwala zapisywać ślady systemu z urządzenia, a następnie udostępnij swojemu zespołowi programistów raport o tych nagraniach. Ten raport obsługują wiele formatów, w tym HTML.

Dzięki zbieraniu tych zrzutów możesz rejestrować dane dotyczące czasu związanego z procesami i wątkami aplikacji oraz wyświetlać inne typy stanów urządzenia o znaczeniu globalnym.

Aby dowiedzieć się więcej o tym narzędziu, przeczytaj sekcję Wykonywanie na urządzeniu .