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.](https://developer.android.google.cn/static/images/about/versions/pie/rtt-nav.png?authuser=7&hl=pl)
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](https://developer.android.google.cn/static/images/about/versions/pie/emulator-devoptions-cutout_2x.png?authuser=7&hl=pl)
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:
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Możesz symulować wycięcie w ekranie na dowolnym urządzeniu lub emulatorze z Androidem 9 w ten sposób:
- Włącz opcje programisty.
- Na ekranie Opcje programisty przewiń w dół do sekcji Rysunek i wybierz Symuluj wyświetlacz z wycięciem.
- 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](https://developer.android.google.cn/static/images/about/versions/pie/p-messaging.jpg?authuser=7&hl=pl)
MessagingStyle ze zdjęciem.
![Powiadomienie o wiadomościach](https://developer.android.google.cn/static/images/about/versions/pie/p-replies.jpg?authuser=7&hl=pl)
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 klasyPerson
zamiastCharSequence
. KlasaPerson
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ć:PRIORITY_CATEGORY_ALARMS
nadaje priorytet alarmom.PRIORITY_CATEGORY_MEDIA
nadaje priorytet dźwiękom ze źródeł multimedialnych, takich jak multimedia i nawigacja głosowa.PRIORITY_CATEGORY_SYSTEM
traktuje priorytetowo dźwięki systemowe.
NotificationManager.Policy
ma też 7 nowych wartości stałych Do-Not-Disturb, które służą do eliminowania zakłóceń wizualnych:SUPPRESSED_EFFECT_FULL_SCREEN_INTENT
uniemożliwia powiadomieniu włączenie aktywności na pełnym ekranie.SUPPRESSED_EFFECT_LIGHTS
zasłania diody powiadomień.SUPPRESSED_EFFECT_PEEK
sprawia, że powiadomienia nie pojawiają się na chwilę w widoku (tzw. „wygląd”).SUPPRESSED_EFFECT_STATUS_BAR
uniemożliwia wyświetlanie powiadomień na pasku stanu na urządzeniach, które go obsługują.SUPPRESSED_EFFECT_BADGE
blokuje plakietki na urządzeniach obsługujących plakietki. Więcej informacji znajdziesz w artykule Modyfikowanie plakietki powiadomienia.SUPPRESSED_EFFECT_AMBIENT
blokuje powiadomienia na urządzeniach, które obsługują wygaszacze z powiadomieniami.SUPPRESSED_EFFECT_NOTIFICATION_LIST
uniemożliwia wyświetlanie powiadomień w widoku listy na urządzeniach obsługujących ten widok, np. w obszarze powiadomień lub na ekranie blokady.
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 dosetTargetSampleSize()
. - Aby przyciąć obraz, który mieści się w zakresie skalowanego obrazu, wywołaj metodę
setCrop()
. - Aby utworzyć zmienną mapę bitową, przekaż
true
dosetMutableRequired()
.
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:
- Operacje matematyczne na poziomie elementów:
- Operacje na tablicach:
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:
- Użytkownik włączył kopię zapasową na Androidzie 9 lub nowszym.
- Użytkownik ustawił na urządzeniu blokadę ekranu, która wymaga kodu PIN, wzoru lub hasła do odblokowania.
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, aACTION_SHOW_TOOLTIP
iACTION_HIDE_TOOLTIP
– aby pokazywać i ukrywać etykietki z instancjiView
. - 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
iGLOBAL_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ę](https://developer.android.google.cn/static/images/about/versions/pie/rotate-changes.gif?authuser=7&hl=pl)
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 zadaniuTextClassifier
zastępują funkcje klasyLinkify
.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.