Android 10 (poziom interfejsu API 29) wprowadza szereg funkcji i zmian w zachowaniu, które mają lepiej chronić prywatność użytkowników. Te zmiany zwiększają przejrzystość i kontrolę, jaką użytkownicy mają nad swoimi danymi i możliwościami, które dają aplikacjom. Te funkcje mogą oznaczać, że określone zachowania lub dane, od których zależy Twoja aplikacja, mogą działać inaczej niż w starszych wersjach platformy. Jeśli Twoja aplikacja jest zgodna z obecnymi sprawdzonymi metodami dotyczącymi przetwarzania danych użytkownika, wpływ na nią powinien być minimalny.
Na tej stronie znajdziesz podsumowanie każdej zmiany.
Najważniejsze zmiany
W tej sekcji znajdziesz najważniejsze zmiany w Androidzie 10 związane z prywatnością.
Dostęp do pamięci zewnętrznej ograniczony do plików i multimediów aplikacji
Domyślnie aplikacje kierowane na Androida 10 lub nowszego mają ograniczony dostęp do miejsca na dane, czyli ograniczony dostęp do miejsca na dane. Takie aplikacje mogą wyświetlać te typy plików na zewnętrznym urządzeniu pamięci masowej bez konieczności proszenia o jakiekolwiek uprawnienia użytkownika związane z pamięcią:
- Pliki w katalogu aplikacji, do których dostęp można uzyskać za pomocą metody
getExternalFilesDir(). - zdjęcia, filmy i klipy audio utworzone przez aplikację z magazynu multimediów;
Aby dowiedzieć się więcej o ograniczonym dostępie do miejsca na dane oraz o tym, jak udostępniać, otwierać i modyfikować pliki zapisane na zewnętrznych urządzeniach pamięci masowej, zapoznaj się z przewodnikami na temat zarządzania plikami w pamięci zewnętrznej oraz uzyskiwania dostępu do plików multimedialnych i ich modyfikowania.
Dostęp do lokalizacji urządzenia w tle wymaga uprawnień
Aby zapewnić użytkownikom dodatkową kontrolę nad dostępem aplikacji do informacji o lokalizacji, w Androidzie 10 wprowadziliśmy uprawnienie ACCESS_BACKGROUND_LOCATION.
W przeciwieństwie do uprawnień ACCESS_FINE_LOCATION i ACCESS_COARSE_LOCATION uprawnienie ACCESS_BACKGROUND_LOCATION wpływa na dostęp aplikacji do lokalizacji tylko wtedy, gdy działa ona w tle. Aplikacja jest uznawana za uzyskującą dostęp do lokalizacji w tle, chyba że spełniony jest jeden z tych warunków:
- Aktywność należąca do aplikacji jest widoczna.
Aplikacja uruchamia usługę na pierwszym planie, która ma zadeklarowany typ usługi na pierwszym planie
location.Aby zadeklarować typ usługi na pierwszym planie w aplikacji, ustaw
targetSdkVersionlubcompileSdkVersionaplikacji na29lub wyższą wartość. Dowiedz się więcej o tym, jak usługi na pierwszym planie mogą kontynuować działania zainicjowane przez użytkownika, które wymagają dostępu do lokalizacji.
Jeśli aplikacja tworzy i monitoruje geofence i jest kierowana na Androida 10 (API na poziomie 29) lub nowszego, musisz zadeklarować uprawnienie ACCESS_BACKGROUND_LOCATION.
Dostęp przyznawany automatycznie w przypadku kierowania na Androida 9 lub starszego
Jeśli aplikacja działa na Androidzie 10 lub nowszym, ale jest kierowana na Androida 9 (API na poziomie 28) lub starszego, platforma stosuje te zasady:
- Jeśli aplikacja deklaruje element
<uses-permission>dlaACCESS_FINE_LOCATIONlubACCESS_COARSE_LOCATION, system automatycznie dodaje element<uses-permission>dlaACCESS_BACKGROUND_LOCATIONpodczas instalacji. - Jeśli aplikacja prosi o
ACCESS_FINE_LOCATIONlubACCESS_COARSE_LOCATION, system automatycznie dodaje do żądaniaACCESS_BACKGROUND_LOCATION.
Dostęp po uaktualnieniu urządzenia do Androida 10
Jeśli użytkownik przyzna aplikacji dostęp do lokalizacji urządzenia (ACCESS_COARSE_LOCATION lub ACCESS_FINE_LOCATION), a następnie uaktualni system na urządzeniu z Androida 9 do Androida 10, system automatycznie zaktualizuje zestaw uprawnień dostępu do lokalizacji przyznanych aplikacji. Zestaw uprawnień, które aplikacja otrzyma po uaktualnieniu, zależy od docelowej wersji pakietu SDK i zdefiniowanych uprawnień, jak pokazano w tej tabeli:
Tabela 1. Zmiany stanu dostępu do lokalizacji po uaktualnieniu urządzenia do Androida 10
| Wersja platformy docelowej | Czy przyznano uprawnienia do lokalizacji przybliżonej lub dokładnej? |
Czy uprawnienia do działania w tle są zdefiniowane w pliku manifestu? |
Zaktualizowano domyślny stan uprawnień |
|---|---|---|---|
| Android 10 | Tak | Tak | Dostęp na pierwszym planie i w tle |
| Android 10 | Tak | Nie | Dostęp tylko na pierwszym planie |
| Android 10 | Nie | (Ignorowane przez system) | Brak dostępu |
| Android 9 lub starszy | Tak | Automatycznie dodawane przez system podczas uaktualniania urządzenia | Dostęp na pierwszym planie i w tle |
| Android 9 lub starszy | Nie | (Ignorowane przez system) | Brak dostępu |
Pamiętaj, że użytkownik może zmienić ten poziom dostępu nawet po tym, jak system automatycznie zaktualizuje dostęp aplikacji do lokalizacji urządzenia. Użytkownik może na przykład ograniczyć dostęp aplikacji tylko do pierwszego planu lub całkowicie go cofnąć. Przed próbą uzyskania dostępu do lokalizacji urządzenia, zwłaszcza w ramach usługi (działającej) na pierwszym planie, aplikacja powinna sprawdzić, czy użytkownik nadal zezwala jej na otrzymywanie tych informacji o lokalizacji.
Dostęp został unieważniony podczas aktualizowania docelowego poziomu interfejsu API na urządzeniach z Androidem 10
Rozważmy przypadek, w którym aplikacja jest już zainstalowana na urządzeniu z Androidem 10. Jeśli w takiej sytuacji zaktualizujesz aplikację, aby była kierowana na Androida 10, urządzenie unieważni uprawnienie ACCESS_BACKGROUND_LOCATION.
Więcej informacji o tym, jak pobierać lokalizację urządzenia, gdy aplikacja działa w tle, znajdziesz w przewodniku na temat otrzymywania okresowych informacji o zmianie lokalizacji.
Ograniczenia dotyczące rozpoczynania działań w tle
Od Androida 10 system nakłada ograniczenia na rozpoczynanie działań w tle. Ta zmiana zachowania pomaga zminimalizować zakłócenia i zapewnia użytkownikowi większą kontrolę nad tym, co wyświetla się na ekranie. Jeśli aplikacja uruchamia aktywności w bezpośrednim wyniku interakcji z użytkownikiem, najprawdopodobniej nie podlega tym ograniczeniom.
Więcej informacji o zalecanej alternatywie dla uruchamiania aktywności w tle znajdziesz w przewodniku na temat powiadamiania użytkowników o wydarzeniach zależnych od czasu w aplikacji.
Identyfikatory i dane
W tej sekcji znajdziesz zmiany dotyczące pracy z identyfikatorami i danymi urządzeń.
Usunięcie powiązania kontaktów
Od Androida 10 platforma nie śledzi informacji o powiązaniach kontaktów. W rezultacie, jeśli aplikacja przeprowadzi wyszukiwanie w kontaktach użytkownika, wyniki nie będą uporządkowane według częstotliwości interakcji.
Przewodnik dotyczący ContactsProvider zawiera powiadomienie opisujące konkretne pola i metody, które są przestarzałe na wszystkich urządzeniach z Androidem 10 lub nowszym.
Randomizacja adresu MAC
Na urządzeniach z Androidem 10 lub nowszym system domyślnie przesyła losowe adresy MAC.
Jeśli Twoja aplikacja obsługuje przypadek użycia w firmie, platforma udostępnia interfejsy API do kilku operacji związanych z adresami MAC:
- Uzyskiwanie randomizowanego adresu MAC: aplikacje właściciela urządzenia i aplikacje właściciela profilu mogą pobierać randomizowany adres MAC przypisany do konkretnej sieci, wywołując metodę
getRandomizedMacAddress(). - Uzyskiwanie rzeczywistego, fabrycznego adresu MAC: aplikacje właściciela urządzenia mogą pobrać rzeczywisty adres MAC sprzętu, wywołując metodę
getWifiMacAddress(). Ta metoda jest przydatna do śledzenia flot urządzeń.
Ograniczenie dostępu do systemu plików /proc/net
Na urządzeniach z Androidem 10 lub nowszym aplikacje nie mają dostępu do /proc/net, która zawiera informacje o stanie sieci urządzenia. Aplikacje, które potrzebują dostępu do tych informacji, np. VPN, powinny używać klasy NetworkStatsManager lub ConnectivityManager.
Ograniczenie dotyczące niemożliwych do zresetowania identyfikatorów urządzeń
Od Androida 10 aplikacje muszą mieć uprawnienia uprzywilejowane READ_PRIVILEGED_PHONE_STATE, aby mieć dostęp do identyfikatorów urządzenia, których nie można zresetować, takich jak IMEI i numer seryjny.
Dotyczy to tych metod:
BuildTelephonyManager
Jeśli Twoja aplikacja nie ma uprawnień, a mimo to spróbujesz poprosić o informacje o identyfikatorach, których nie można zresetować, odpowiedź platformy będzie się różnić w zależności od docelowej wersji pakietu SDK:
- Jeśli aplikacja jest kierowana na Androida 10 lub nowszego, występuje błąd
SecurityException. - Jeśli aplikacja jest kierowana na Androida 9 (API na poziomie 28) lub starszego, metoda zwraca wartość
nulllub dane zastępcze, jeśli aplikacja ma uprawnienieREAD_PHONE_STATE. W przeciwnym razie wystąpiSecurityException.
W wielu przypadkach użycia nie są potrzebne niemożliwe do zresetowania identyfikatory urządzeń. Jeśli na przykład aplikacja używa niemożliwych do zresetowania identyfikatorów urządzeń do śledzenia reklam lub analizowania informacji o użytkownikach, w tych konkretnych przypadkach użyj identyfikatora wyświetlania reklam na urządzeniach z Androidem. Więcej informacji znajdziesz w artykule o sprawdzonych metodach stosowania unikalnych identyfikatorów.
Ograniczony dostęp do danych w schowku
Jeśli Twoja aplikacja nie jest domyślnym edytorem metody wprowadzania (IME) lub nie jest obecnie aktywna, nie może uzyskać dostępu do danych schowka na Androidzie 10 lub nowszym.
Ochrona numeru seryjnego urządzenia USB
Jeśli aplikacja jest kierowana na Androida 10 lub nowszego, nie może odczytać numeru seryjnego, dopóki użytkownik nie przyzna jej uprawnień aplikacji dostępu do urządzenia lub akcesorium USB.
Więcej informacji o pracy z urządzeniami USB znajdziesz w przewodniku na temat konfigurowania hostów USB.
Aparat i łączność
W tej sekcji znajdziesz zmiany dotyczące metadanych aparatu i interfejsów API łączności.
Ograniczenie dostępu do szczegółów i metadanych aparatu
Android 10 zmienia zakres informacji, które domyślnie zwraca metoda getCameraCharacteristics(). W szczególności aplikacja musi mieć uprawnienie CAMERA, aby uzyskać dostęp do potencjalnie specyficznych dla urządzenia metadanych, które są zawarte w wartości zwracanej przez tę metodę.
Więcej informacji o tych zmianach znajdziesz w sekcji dotyczącej pól kamery, które wymagają uprawnień.
Ograniczenie dotyczące włączania i wyłączania Wi-Fi
Aplikacje kierowane na Androida 10 lub nowszego nie mogą włączać ani wyłączać Wi-Fi. Metoda WifiManager.setWifiEnabled() zawsze zwraca false.
Jeśli chcesz poprosić użytkowników o włączenie lub wyłączenie Wi-Fi, użyj panelu ustawień.
Ograniczenia bezpośredniego dostępu do skonfigurowanych sieci Wi-Fi
Aby chronić prywatność użytkowników, ręczna konfiguracja listy sieci Wi-Fi jest ograniczona do aplikacji systemowych i kontrolerów zasad dotyczących urządzeń (DPC). Dany kontroler zasad urządzenia może być właścicielem urządzenia lub właścicielem profilu.
Jeśli aplikacja jest kierowana na Androida 10 lub nowszego i nie jest aplikacją systemową ani kontrolerem zasad urządzeń, te metody nie zwracają przydatnych danych:
Metoda
getConfiguredNetworks()zawsze zwraca pustą listę.Każda metoda operacji sieciowej, która zwraca wartość całkowitą –
addNetwork()iupdateNetwork()– zawsze zwraca -1.Każda operacja sieciowa, która zwraca wartość logiczną –
removeNetwork(),reassociate(),enableNetwork(),disableNetwork(),reconnect()idisconnect()– zawsze zwracafalse.
Jeśli aplikacja musi łączyć się z sieciami Wi-Fi, użyj tych metod alternatywnych:
- Aby natychmiast nawiązać połączenie lokalne z siecią Wi-Fi, użyj
WifiNetworkSpecifierw standardowym obiekcieNetworkRequest. - Aby dodać sieci Wi-Fi, które mają być brane pod uwagę przy zapewnianiu użytkownikowi dostępu do internetu, użyj obiektów
WifiNetworkSuggestion. Możesz dodawać i usuwać sieci, które pojawiają się w oknie wyboru sieci do automatycznego łączenia, wywołując odpowiednio funkcjeaddNetworkSuggestions()iremoveNetworkSuggestions(). Te metody nie wymagają żadnych uprawnień dostępu do lokalizacji.
Niektóre interfejsy API telefonii, Bluetootha i Wi-Fi wymagają uprawnień do dokładnej lokalizacji
Jeśli aplikacja jest kierowana na Androida 10 lub nowszego, musi mieć uprawnienie ACCESS_FINE_LOCATION, aby mogła używać kilku metod w interfejsach API Wi-Fi, Wi-Fi Aware lub Bluetooth. W sekcjach poniżej znajdziesz listę klas i metod, których to dotyczy.
Połączenia telefoniczne
TelephonyManagergetCellLocation()getAllCellInfo()requestNetworkScan()requestCellInfoUpdate()getAvailableNetworks()getServiceState()
TelephonyScanManagerrequestNetworkScan()
TelephonyScanManager.NetworkScanCallbackonResults()
PhoneStateListeneronCellLocationChanged()onCellInfoChanged()onServiceStateChanged()
Wi-Fi
WifiManagerstartScan()getScanResults()getConnectionInfo()getConfiguredNetworks()
WifiAwareManagerWifiP2pManagerWifiRttManager
Bluetooth
BluetoothAdapterstartDiscovery()startLeScan()
BluetoothAdapter.LeScanCallbackBluetoothLeScannerstartScan()
Uprawnienia
W tej sekcji opisano zmiany w modelu uprawnień Androida.
Ograniczony dostęp do treści na ekranie
Aby chronić zawartość ekranu użytkowników, Android 10 uniemożliwia cichy dostęp do zawartości ekranu urządzenia przez zmianę zakresu uprawnień READ_FRAME_BUFFER, CAPTURE_VIDEO_OUTPUT i CAPTURE_SECURE_VIDEO_OUTPUT. Od Androida 10 te uprawnienia są dostępne tylko w trybie signature-access.
Aplikacje, które potrzebują dostępu do zawartości ekranu urządzenia, powinny używać interfejsu API MediaProjection, który wyświetla prośbę o zgodę użytkownika.
Sprawdzanie uprawnień dla użytkownika w starszych aplikacjach
Jeśli aplikacja jest kierowana na Androida 5.1 (poziom interfejsu API 22) lub starszego, użytkownicy zobaczą ekran uprawnień, gdy po raz pierwszy użyją aplikacji na urządzeniu z Androidem 10 lub nowszym, jak pokazano na rysunku 1. Na tym ekranie użytkownicy mogą cofnąć uprawnienia, które system przyznał wcześniej aplikacji podczas instalacji.
Rozpoznawanie aktywności fizycznej
Android 10 wprowadza uprawnienia czasu działania android.permission.ACTIVITY_RECOGNITION dla aplikacji, które muszą wykrywać liczbę kroków użytkownika lub klasyfikować jego aktywność fizyczną, np. chodzenie, jazdę na rowerze lub poruszanie się pojazdem. Dzięki temu użytkownicy mogą zobaczyć, jak dane z czujników urządzenia są wykorzystywane w Ustawieniach.
Niektóre biblioteki w usługach Google Play, takie jak Activity Recognition API i Google Fit API, nie będą działać, jeśli użytkownik nie przyzna aplikacji tego uprawnienia.
Jedynymi wbudowanymi czujnikami na urządzeniu, które wymagają zadeklarowania tego uprawnienia, są licznik kroków i wykrywacz kroków.
Jeśli Twoja aplikacja jest kierowana na Androida 9 (poziom API 28) lub starszego, system automatycznie przyznaje jej uprawnienie android.permission.ACTIVITY_RECOGNITION, jeśli spełnia ona wszystkie te warunki:
- Plik manifestu zawiera uprawnienia
com.google.android.gms.permission.ACTIVITY_RECOGNITION. - Plik manifestu nie zawiera uprawnień
android.permission.ACTIVITY_RECOGNITION.
Jeśli system automatycznie przyzna uprawnienie android.permission.ACTIVITY_RECOGNITION, aplikacja zachowa je po zaktualizowaniu do wersji kierowanej na Androida 10. Użytkownik może jednak w każdej chwili cofnąć to uprawnienie w ustawieniach systemu.
Usunięcie grup uprawnień z interfejsu
Od Androida 10 aplikacje nie mogą sprawdzać, jak uprawnienia są pogrupowane w interfejsie.