Android 9 (poziom interfejsu API 28) wprowadza wiele zmian w systemie Android. Podane niżej zmiany zachowania dotyczą wszystkich aplikacji, które działają na platformie Androida 9, niezależnie od poziomu interfejsu API, na który są kierowane. Wszyscy deweloperzy powinni zapoznać się z tymi zmianami i w odpowiednich przypadkach odpowiednio zmodyfikować swoje aplikacje.
Zmiany, które dotyczą tylko aplikacji kierowanych na interfejs API na poziomie 28 lub wyższym, znajdziesz w sekcji Zmiany w zachowaniu: aplikacje kierowane na interfejs API na poziomie 28 lub wyższym.
Zarządzanie zasilaniem
Android 9 wprowadza nowe funkcje, które poprawiają zarządzanie energią urządzenia. Te zmiany, wraz z funkcjami, które były dostępne już przed Androidem 9, pomagają zapewnić dostęp do zasobów systemowych aplikacjom, które ich najbardziej potrzebują.
Więcej informacji znajdziesz w artykule Zarządzanie energią.
Zmiany dotyczące prywatności
Aby zwiększyć prywatność użytkowników, Android 9 wprowadza kilka zmian w zachowaniu, takich jak ograniczenie dostępu aplikacji działających w tle do czujników urządzenia, ograniczenie informacji pobieranych z skanowania sieci Wi-Fi oraz nowe reguły i grupy uprawnień związane z połączeniami telefonicznymi, stanem telefonu oraz skanowaniem sieci Wi-Fi.
Te zmiany mają wpływ na wszystkie aplikacje działające na Androidzie 9, niezależnie od wersji docelowego pakietu SDK.
Ograniczony dostęp do czujników w tle
Android 9 ogranicza dostęp aplikacji działających w tle do danych o wprowadzanych przez użytkownika treściach i danych z czujników. Jeśli aplikacja działa w tle na urządzeniu z Androidem 9, system nakłada na nią te ograniczenia:
- Aplikacja nie ma dostępu do mikrofonu ani kamery.
- Czujniki, które używają ciągłego trybu raportowania, takie jak akcelerometry i żyroskopy, nie otrzymują zdarzeń.
- Czujniki, które używają trybów raportowania on-change lub one-shot, nie otrzymują zdarzeń.
Jeśli aplikacja musi wykrywać zdarzenia czujnika na urządzeniach z Androidem 9, użyj usługi na pierwszym planie.
Ograniczony dostęp do dzienników połączeń
Android 9 wprowadza CALL_LOG
grupę uprawnień i przenosi do niej uprawnienia READ_CALL_LOG
,
WRITE_CALL_LOG
i PROCESS_OUTGOING_CALLS
. We wcześniejszych wersjach Androida te uprawnienia znajdowały się w grupie uprawnień PHONE
.
Ta grupa uprawnień CALL_LOG
zapewnia użytkownikom większą kontrolę i widoczność w przypadku aplikacji, które potrzebują dostępu do poufnych informacji o połączeniach telefonicznych, takich jak odczytywanie zapisów połączeń i identyfikowanie numerów telefonów.
Jeśli aplikacja wymaga dostępu do rejestru połączeń lub musi przetwarzać wychodzące połączenia, musisz wyraźnie poprosić o te uprawnienia z grupy uprawnień CALL_LOG
. W przeciwnym razie wystąpi błąd SecurityException
.
Uwaga: ponieważ te uprawnienia zostały przeniesione do innych grup i są przyznawane w czasie wykonywania aplikacji, użytkownik może zablokować dostęp aplikacji do informacji z rejestrów połączeń. W takim przypadku aplikacja powinna być w stanie poradzić sobie z brakiem dostępu do informacji.
Jeśli Twoja aplikacja już stosuje sprawdzone metody dotyczące uprawnień w czasie wykonywania, może obsłużyć zmianę grupy uprawnień.
Ograniczony dostęp do numerów telefonów
Aplikacje działające na Androidzie 9 nie mogą odczytywać numerów telefonów ani stanu telefonu bez wcześniejszego uzyskania uprawnienia READ_CALL_LOG
, oprócz innych uprawnień wymaganych przez przypadki użycia aplikacji.
Numery telefonów powiązane z połączeniami przychodzącymi i wychodzącymi są widoczne w transmisji stanu telefonu, na przykład w przypadku połączeń przychodzących i wychodzących. Można je wyświetlić w klasie PhoneStateListener
.
Bez tegoREAD_CALL_LOG
uprawnienia pole numeru telefonu, które jest dostępne w transmisjach PHONE_STATE_CHANGED
i poprzez PhoneStateListener
, jest puste.
Aby odczytać numery telefonów z stanu telefonu, zaktualizuj aplikację, aby poprosić o wymagane uprawnienia na podstawie przypadku użycia:
- Aby odczytywać liczby z działania intent
PHONE_STATE
, musisz mieć zarówno uprawnieniaREAD_CALL_LOG
, jak iREAD_PHONE_STATE
. - Aby odczytywać liczby z tabeli
onCallStateChanged()
, potrzebujesz tylko uprawnieniaREAD_CALL_LOG
. Nie musisz mieć uprawnieńREAD_PHONE_STATE
.
Ograniczony dostęp do lokalizacji i informacji o połączeniu Wi-Fi
W Androidzie 9 wymagania dotyczące uprawnień aplikacji do wykonywania skanowania Wi-Fi są bardziej rygorystyczne niż w poprzednich wersjach. Więcej informacji znajdziesz w sekcji Ograniczenia skanowania sieci Wi-Fi.
Podobne ograniczenia dotyczą również metody getConnectionInfo()
, która zwraca obiekt WifiInfo
opisujący bieżące połączenie Wi-Fi. Metody tego obiektu można używać do pobierania wartości SSID i BSSID tylko wtedy, gdy aplikacja wywołująca ma te uprawnienia:
- ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION
- ACCESS_WIFI_STATE
Aby pobrać identyfikator SSID lub BSSID, musisz też włączyć na urządzeniu usługi lokalizacyjne (w sekcji Ustawienia > Lokalizacja).
Informacje usunięte z metod obsługi Wi-Fi
W Androidzie 9 te zdarzenia i transmisje nie otrzymują informacji o lokalizacji użytkownika ani danych umożliwiających identyfikację:
- Metody
getScanResults()
igetConnectionInfo()
zWifiManager
. - Metody
discoverServices()
iaddServiceRequest()
zWifiP2pManager
. - Komunikat
NETWORK_STATE_CHANGED_ACTION
.
Systemowy pakiet danych NETWORK_STATE_CHANGED_ACTION
z sieci Wi-Fi nie zawiera już identyfikatora SSID (wcześniej EXTRA_SSID), identyfikatora BSSID (wcześniej EXTRA_BSSID) ani informacji o połączeniu (wcześniej EXTRA_NETWORK_INFO). Jeśli aplikacja potrzebuje tych informacji, wywołaj funkcję getConnectionInfo()
.
Informacje o telefonii są teraz powiązane z ustawieniem lokalizacji urządzenia
Jeśli użytkownik wyłączył lokalizowanie urządzenia na urządzeniu z Androidem 9, te metody nie przynoszą rezultatów:
Ograniczenia dotyczące korzystania z interfejsów innych niż SDK
Aby zapewnić stabilność i zgodność aplikacji, platforma ogranicza użycie niektórych metod i pól, które nie należą do platformy SKAdowe. Ograniczenia te obowiązują niezależnie od tego, czy próbujesz uzyskać dostęp do tych metod i pól bezpośrednio, za pomocą funkcji odbicia lustrzanego czy za pomocą JNI. W Androidzie 9 aplikacja może nadal uzyskiwać dostęp do tych ograniczonych interfejsów. Platforma używa komunikatów i wpisów w dzienniku, aby zwrócić na nie uwagę. Jeśli w Twojej aplikacji pojawia się taka informacja, musisz zastosować inną strategię implementacji niż interfejs z ograniczeniami. Jeśli uważasz, że nie ma żadnej alternatywnej strategii, możesz zgłosić błąd, aby poprosić o ponowne rozpatrzenie ograniczenia.
Więcej ważnych informacji znajdziesz w artykule Ograniczenia dotyczące interfejsów innych niż SDK. Przejrzyj je, aby mieć pewność, że aplikacja będzie nadal działać prawidłowo.
Zmiany w działaniu zabezpieczeń
Zmiany zabezpieczeń urządzenia
Android 9 wprowadza kilka funkcji, które zwiększają bezpieczeństwo aplikacji niezależnie od tego, na którą wersję jest ona kierowana.
Zmiany w implementacji TLS
W Androidzie 9 wdrożenie TLS przeszło kilka zmian:
- Jeśli podczas tworzenia instancji
SSLSocket
nie uda się nawiązać połączenia, system zwróci błądIOException
zamiast błęduNullPointerException
. - Klasa
SSLEngine
sprawnie obsługuje wszystkie alertyclose_notify
, które się pojawiają.
Więcej informacji o wysyłaniu bezpiecznych żądań sieciowych w aplikacji na Androida znajdziesz w artykule Przykład HTTPS.
Surowsze filtrowanie SECCOMP
Android 9 jeszcze bardziej ogranicza wywołania systemowe dostępne dla aplikacji. To działanie jest rozszerzeniem filtra SECCOMP, który jest zawarty w Androidzie 8.0 (poziom interfejsu API 26).
Zmiany dotyczące kryptografii
Android 9 wprowadza kilka zmian w implementacji i obsługiwaniu algorytmów kryptograficznych.
Implementacje parametrów i algorytmów w Conscrypt
Android 9 udostępnia dodatkowe implementacje parametrów algorytmu w Conscrypt. Te parametry to: AES, DESEDE, OAEP i EC. W wersji 9 Androida wycofane zostały wersje tych parametrów i wielu algorytmów z usług Bouncy Castle.
Jeśli Twoja aplikacja jest kierowana na Androida 8.1 (poziom interfejsu API 27) lub niższą wersję, otrzymasz ostrzeżenie, gdy zażądasz implementacji Bouncy Castle jednego z tych wycofanych algorytmów. Jeśli jednak kierujesz reklamy na Androida 9, te żądania będą wywoływać błąd
NoSuchAlgorithmException
.
Inne zmiany
Android 9 wprowadza kilka innych zmian związanych z kryptografia:
- Jeśli podczas używania kluczy PBE biblioteka Bouncy Castle oczekuje wektora inicjalizacji (IV), a aplikacja go nie podaje, pojawi się ostrzeżenie.
- Implementacja szyfru ARC4 w Conscrypt umożliwia ustawienie opcji ARC4/ECB/NoPadding lub ARC4/NONE/NoPadding.
- Usunięto dostawcę Crypto Java Cryptography Architecture (JCA). W efekcie, jeśli Twoja aplikacja wywoła funkcję
SecureRandom.getInstance("SHA1PRNG", "Crypto")
, nastąpi błądNoSuchProviderException
. - Jeśli aplikacja parsuje klucze RSA z buforów większych niż struktura klucza, wyjątek nie wystąpi.
Więcej informacji o funkcjach kryptograficznych Androida znajdziesz w artykule Kryptograficzne.
Zaszyfrowane pliki Androida nie są już obsługiwane
Android 9 całkowicie usuwa obsługę zaszyfrowanych plików Androida (ASEC).
W Androidzie 2.2 (poziom interfejsu API 8) wprowadzono ASEC, aby obsługiwać aplikacje na karcie SD. W Androidzie 6.0 (poziom interfejsu API 23) wprowadzono technologię adoptable storage, której deweloperzy mogą używać zamiast ASEC.
Aktualizacje bibliotek ICU
Android 9 używa wersji 60 biblioteki ICU. Android 8.0 (poziom interfejsu API 26) i Android 8.1 (poziom interfejsu API 27) korzystają z wersji ICU 58.
ICU służy do udostępniania publicznych interfejsów API w ramach interfejsu android.icu package
. Jest też używany wewnętrznie na platformie Android do obsługi międzynarodowej.
Jest on na przykład używany do implementowania klas Androida w plikach java.util
, java.text
i android.text.format
.
Aktualizacja do ICU 60 zawiera wiele drobnych, ale przydatnych zmian, w tym obsługę danych Emoji 5.0 i ulepszone formaty daty i czasu, opisane w notatkach o wersjach ICU 59 i ICU 60.
Ważne zmiany w tej aktualizacji:
- Zmieniliśmy sposób obsługi stref czasowych przez platformę.
- Platforma lepiej obsługuje czas GMT i UTC. Czas UTC nie jest już synonimem czasu GMT.
ICU udostępnia teraz przetłumaczone nazwy stref GMT i UTC. Ta zmiana wpływa na formatowanie i parsowanie
android.icu
w przypadku stref czasowych takich jak „GMT”, „Etc/GMT”, „UTC”, „Etc/UTC” i „Zulu”. java.text.SimpleDateFormat
teraz używa ICU do wyświetlania nazw strefy UTC /GMT:- Formatowanie
zzzz
generuje długi ciąg znaków zlokalizowany na potrzeby wielu ustawień regionalnych. Wcześniej w przypadku czasu UTC zwracał on wartość „UTC”, a w przypadku czasu GMT – ciągi znaków takie jak „GMT+00:00”. - Analizowanie
zzzz
rozpoznaje ciągi znaków takie jak „Uniwersalny czas koordynowany” i „Czas Greenwich”. - Aplikacje mogą napotkać problemy ze zgodnością, jeśli zakładają, że „UTC” lub „GMT+00:00” są wyjściem dla
zzzz
we wszystkich językach.
- Formatowanie
- Zmieniło się działanie funkcji
java.text.DateFormatSymbols.getZoneStrings()
:- Podobnie jak w przypadku
SimpleDateFormat
, strefy czasowe UTC i GMT mają teraz długie nazwy. Zmienne nazwy stref czasowych z czasem letnim dla strefy UTC, takie jak „UTC”, „Etc/UTC” i „Zulu”, stają się GMT+00:00, co jest standardowym rozwiązaniem zastępczym, gdy nie ma dostępnych nazw, zamiast zakodowanego na stałe ciąguUTC
. - Niektóre identyfikatory stref są prawidłowo rozpoznawane jako synonimy innych stref, dzięki czemu Android znajduje ciągi znaków dla przestarzałych identyfikatorów stref, takich jak
Eire
, które wcześniej nie mogły zostać rozwiązane.
- Podobnie jak w przypadku
- Strefa Asia/Hanoi nie jest już rozpoznawana. Z tego powodu funkcja
java.util.TimeZones.getAvailableIds()
nie zwraca tej wartości, a funkcjajava.util.TimeZone.getTimeZone()
jej nie rozpoznaje. Jest to zgodne z dotychczasowym działaniemandroid.icu
.
- Platforma lepiej obsługuje czas GMT i UTC. Czas UTC nie jest już synonimem czasu GMT.
- Metoda
android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String)
może zwrócić wartośćParseException
nawet podczas analizowania prawidłowego tekstu waluty. Aby uniknąć tego problemu, użyj wartościNumberFormat.parseCurrency
, która jest dostępna od Androida 7.0 (poziom interfejsu API 24) w przypadku tekstu waluty w formaciePLURALCURRENCYSTYLE
.
Zmiany w Android Test
Android 9 wprowadza kilka zmian w bibliotece i strukturze klas Android Test framework. Te zmiany pomagają deweloperom korzystać z publicznych interfejsów API obsługiwanych przez framework, ale zapewniają też większą elastyczność w tworzeniu i uruchamianiu testów za pomocą bibliotek innych firm lub logiki niestandardowej.
Biblioteki usunięte z ramy
Android 9.0 reorganizuje klasy oparte na JUnit w 3 biblioteki: android.test.base, android.test.runner i android.test.mock.
Ta zmiana umożliwia uruchamianie testów w wersji JUnit, która najlepiej współpracuje z zależnościami projektu. Ta wersja JUnit może być inna niż ta, którą udostępnia android.jar
.
Więcej informacji o tym, jak klasy oparte na JUnit są zorganizowane w tych bibliotekach, oraz jak przygotować projekt aplikacji do pisania i uruchamiania testów, znajdziesz w artykule Konfigurowanie projektu na potrzeby testów Android Test.
Zmiany w kompilacji zestawu testów
Metoda addRequirements()
w klasie TestSuiteBuilder
została usunięta, a sama klasa TestSuiteBuilder
została wycofana.
Metoda addRequirements()
wymagała od programistów podania argumentów, których typy są ukrytymi interfejsami API, co powodowało nieprawidłowość interfejsu API.
Dekoder UTF w Javie
UTF-8 to domyślny zestaw znaków na Androidzie. Sekwencja bajtów UTF-8 może zostać zdekodowana przez konstruktor String
, np. String(byte[] bytes)
.
Dekoder UTF-8 w Androidzie 9 stosuje standardy Unicode w bardziej rygorystyczny sposób niż w poprzednich wersjach. Zmiany obejmują:
- Nienajkrótsza forma UTF-8, np.
<C0, AF>
, jest traktowana jako nieprawidłowa. - Postać zastępcza UTF-8, np.
U+D800
..U+DFFF
, jest traktowana jako źle sformułowana. - Maksymalna podczęść jest zastępowana pojedynczym
U+FFFD
. Na przykład w sekwencji bajtów „41 C0 AF 41 F4 80 80 41
” maksymalne podciągi to „C0
”, „AF
” i „F4 80 80
”. „F4 80 80
” może być początkowym podciągiem ciągu „F4 80 80 80
”, ale „C0
” nie może być początkowym podciągiem żadnej poprawnej sekwencji jednostek kodu. Dane wyjściowe powinny wyglądać tak:A\ufffd\ufffdA\ufffdA
. - Aby zdekodować zmodyfikowaną sekwencję UTF-8 / CESU-8 w Androidzie 9 lub nowszym, użyj metody
DataInputStream.readUTF()
lub metody JNINewStringUTF()
.
Weryfikacja nazwy hosta za pomocą certyfikatu
RFC 2818 opisuje 2 metody dopasowywania nazwy domeny do certyfikatu: za pomocą dostępnych nazw w rozszerzeniu subjectAltName
(SAN
) lub, w przypadku braku rozszerzenia SAN
, z użyciem rozszerzenia commonName
(CN
).
Jednak w standardzie RFC 2818 wycofano obsługę CN
. Z tego powodu Android nie używa już CN
. Aby zweryfikować nazwę hosta, serwer musi przedstawić certyfikat z odpowiednim SAN
. Certyfikaty, które nie zawierają SAN
pasującego do nazwy hosta, nie są już zaufane.
Wyszukiwanie adresów sieciowych może powodować naruszenia zasad sieciowych
Wyszukiwania adresów sieciowych, które wymagają rozpoznawania nazw, mogą wiązać się z wejściem/wyjściem sieciowym i zatem są uważane za operacje blokujące. Blokowanie operacji w wątku głównym może powodować przerwy lub zakłócenia.
Klasa StrictMode
to narzędzie programistyczne, które pomaga deweloperom wykrywać problemy w kodzie.
W Androidzie 9 i nowszych StrictMode
wykrywa naruszenia sieci spowodowane wyszukiwaniem adresów sieci, które wymagają rozpoznawania nazw.
Nie należy udostępniać aplikacji z włączoną funkcją StrictMode
. Jeśli tak, Twoje aplikacje mogą napotkać wyjątki, takie jak NetworkOnMainThreadException
, gdy używasz metod detectNetwork()
lub detectAll()
, aby uzyskać zasady, które wykrywają naruszenia zasad sieci.
Rozwiązywanie numerycznego adresu IP nie jest uważane za blokowanie. Rozpoznawanie adresów IP w postaci liczbowej działa tak samo jak w wersjach Androida wcześniejszych niż 9.
Tagowanie gniazd
W wersjach platformy starszych niż Android 9, jeśli gniazdo jest otagowane za pomocą metody setThreadStatsTag()
, gniazdo jest odtagowane, gdy jest wysyłane do innego procesu za pomocą bindera IPC z kontenerem ParcelFileDescriptor
.
W Androidzie 9 i nowszych tag gniazda jest zachowany, gdy jest wysyłany do innego procesu za pomocą binder IPC. Ta zmiana może mieć wpływ na statystyki ruchu sieciowego, na przykład w przypadku korzystania z metody queryDetailsForUidTag()
.
Jeśli chcesz zachować działanie poprzednich wersji, które odznacza gniazdo wysłane do innego procesu, możesz wywołać funkcję untagSocket()
przed wysłaniem gniazda.
Zgłaszana liczba dostępnych bajtów w gniezdziu
Metoda available()
zwraca wartość 0
, gdy zostanie wywołana po wywołaniu metody shutdownInput()
.
bardziej szczegółowe raporty o możliwościach sieciowych VPN,
W Androidzie 8.1 (poziom interfejsu API 27) i starszych klasa NetworkCapabilities
przekazywała tylko ograniczony zestaw informacji o sieciach VPN, takich jak TRANSPORT_VPN
, ale pomijając NET_CAPABILITY_NOT_VPN
. Z powodu tych ograniczonych informacji trudno było ustalić, czy korzystanie z VPN spowoduje obciążenie użytkownika aplikacji. Na przykład sprawdzenie parametru NET_CAPABILITY_NOT_METERED
nie pozwoli określić, czy sieci podstawowe były objęte naliczaniem.
W Androidzie 9 i nowszych, gdy VPN wywołuje metodę setUnderlyingNetworks()
, system Android łączy transporty i możliwości wszystkich sieci podrzędnych, a następnie zwraca wynik jako skuteczne możliwości sieci VPN.
W Androidzie 9 i nowszych aplikacje, które już sprawdzają dostępność NET_CAPABILITY_NOT_METERED
, otrzymują możliwości sieci VPN i sieci podrzędnych.
Pliki w folderze xt_qtaguid nie są już dostępne dla aplikacji
Począwszy od Androida 9 aplikacje nie mogą mieć bezpośredniego dostępu do odczytu plików w folderze /proc/net/xt_qtaguid
. Dzieje się tak, aby zapewnić spójność z niektórymi urządzeniami, na których te pliki wcale nie występują.
Publiczne interfejsy API, które korzystają z tych plików, czyli TrafficStats
i NetworkStatsManager
, nadal działają zgodnie z oczekiwaniami.
Nieobsługiwane funkcje cutils, takie jak qtaguid_tagSocket()
, mogą nie działać zgodnie z oczekiwaniami lub w ogóle na różnych urządzeniach.
Wymagany jest teraz flaga FLAG_ACTIVITY_NEW_TASK
W Androidzie 9 nie możesz uruchomić aktywności z kontekstu poza aktywnością, chyba że przekażesz flagę intencji
FLAG_ACTIVITY_NEW_TASK
.
Jeśli spróbujesz uruchomić aktywność bez przekazania tej flagi, aktywność nie rozpocznie się, a system wypisze komunikat do dziennika.
Zmiany w obrocie ekranu
Począwszy od Androida 9 wprowadzono istotne zmiany w trybie portretowym. W Androidzie 8.0 (poziom interfejsu API 26) użytkownicy mogli przełączać się między trybami automatycznego obracania i portretowego za pomocą kafelka Szybkie ustawienia lub ustawień wyświetlacza. Tryb pionowy został przemianowany na blokadę orientacji i jest aktywny, gdy autoobracanie jest wyłączone. Nie wprowadziliśmy żadnych zmian w trybie autoobracania.
Gdy urządzenie jest w trybie blokady orientacji, użytkownicy mogą zablokować ekran na dowolną orientację obsługiwaną przez widoczną na górze aktywność. Aktywność nie powinna zakładać, że zawsze będzie renderowana w orientacji pionowej. Jeśli główna aktywność może być renderowana w różnych orientacjach w trybie automatycznego obracania, te same opcje powinny być dostępne w trybie zablokowanego obracania, z niektórymi wyjątkami związanymi z ustawieniem screenOrientation
aktywności (patrz tabela poniżej).
Aktywności, które wymagają określonej orientacji (np.
screenOrientation=landscape
), ignorują ustawienie blokady użytkownika i działają tak samo jak w Androidzie 8.0.
Ustawienie orientacji ekranu można określić na poziomie aktywności w pliku AndroidManifest lub programowo za pomocą metody setRequestedOrientation().
Tryb blokady orientacji działa poprzez ustawienie preferencji użytkownika, których WindowManager używa do obsługi orientacji aktywności. Ustawienie rotacji użytkowników może zostać zmienione w tych przypadkach: Pamiętaj, że istnieje tendencja do powrotu do naturalnego ustawienia orientacji urządzenia, która jest zwykle pionowa w przypadku urządzeń o formacie telefonu:
- Gdy użytkownik zaakceptuje propozycję rotacji, ustawienie rotacji zmieni się na tę propozycję.
- Gdy użytkownik przełączy się na aplikację w orientacji pionowej (w tym na ekranie blokady lub w wyszukiwarce), ustawienie orientacji zmieni się na pionową.
W tabeli poniżej omówiono zachowanie funkcji obracania w przypadku typowych orientacji ekranu:
Orientacja ekranu | Działanie |
---|---|
nieokreślony, użytkownik | W trybie automatycznego obracania i blokady obracania Aktywność może być wyświetlana w orientacji pionowej lub poziomej (i na odwrót). Obsługują one układy w orientacji pionowej i poziomej. |
userLandscape | W trybie automatycznego obracania i blokady obracania aktywność może być renderowana w układzie poziomym lub odwróconym poziomym. Obsługa tylko układów poziomych. |
userPortrait | W trybie automatycznego obracania i blokady obracania aktywność może być renderowana w układach pionowym i odwróconym pionowym. Obsługa tylko układów pionowych. |
fullUser | W trybie automatycznego obracania i blokady obracania Aktywność może być wyświetlana w orientacji pionowej lub poziomej (i na odwrót). Obsługuj formaty pionowy i poziomy. Użytkownicy będą mogli zablokować obrót w orientacji pionowej, często o 180°. |
sensor, fullSensor, sensorPortrait, sensorLandscape | Ustawienie trybu blokady orientacji jest ignorowane i traktowane tak, jakby było aktywne automatyczne obracanie. Używaj tej funkcji tylko w wyjątkowych okolicznościach i z dużą dbałością o UX. |
Wycofanie obsługi klienta HTTP Apache wpływa na aplikacje z niestandardowym ClassLoader
W Androidzie 6.0 wyłączyliśmy obsługę klienta HTTP Apache.
Ta zmiana nie ma wpływu na większość aplikacji, które nie są kierowane na Androida w wersji 9 lub nowszej. Zmiana może jednak wpłynąć na niektóre aplikacje, które korzystają z niestandardowej struktury ClassLoader
, nawet jeśli nie są kierowane na Androida 9 lub nowszego.
Aplikacja może być dotknięta, jeśli używa niestandardowego ClassLoader
, który wyraźnie deleguje systemowi ClassLoader
. Aby znaleźć zajęcia w org.apache.http.*
, te aplikacje muszą zamiast tego przekazać uprawnienia aplikacji
ClassLoader
. Jeśli delegują je do systemu ClassLoader
, aplikacje nie będą działać na Androidzie 9 lub nowszym z błędem NoClassDefFoundError
, ponieważ te klasy nie są już znane systemowi ClassLoader
. Aby uniknąć podobnych problemów w przyszłości, aplikacje powinny ogólnie wczytywać klasy za pomocą aplikacji ClassLoader
, a nie uzyskiwać dostępu do systemu ClassLoader
bezpośrednio.
Wyliczanie kamer
Aplikacje działające na urządzeniach z Androidem 9 mogą wykrywać wszystkie dostępne kamery, wywołując funkcję getCameraIdList()
.
Aplikacja nie powinna zakładać, że urządzenie ma tylko 1 tylny aparat lub tylko 1 przedni aparat.
Jeśli np. Twoja aplikacja ma przycisk do przełączania się między przednim a tylnym aparatem, może mieć więcej niż 1 przedni lub tylny aparat do wyboru. Przejrzyj listę kamer, sprawdź ich właściwości i zdecyduj, które z nich mają być widoczne dla użytkownika.