Android 10 (poziom interfejsu API 29) wprowadza kilka funkcji i zmian zachowania, aby lepiej chronić prywatność użytkowników. Dzięki tym zmianom użytkownicy zyskają większą przejrzystość i kontrolę nad swoimi danymi oraz możliwościami, które przyznają aplikacjom. Funkcje te mogą oznaczać, że pewne zachowania lub dane, od których zależy od aplikacji, mogą działać inaczej niż w starszych wersjach platformy. Wpływ na Twoją aplikację powinien być minimalny, jeśli przestrzega ona aktualnych zaleceń dotyczących postępowania z danymi użytkownika.
Na tej stronie znajdziesz podsumowanie każdej zmiany.
Najważniejsze zmiany
Ta sekcja zawiera najważniejsze zmiany w Androidzie 10 dotyczące prywatności.
Dostęp do pamięci zewnętrznej ograniczony do plików i multimediów aplikacji
Domyślnie aplikacje kierowane na Androida 10 i nowsze wersje mają zakres dostępu do pamięci zewnętrznej, czyli zakresu miejsca na dane. Takie aplikacje mogą odczytywać te typy plików na zewnętrznym urządzeniu do przechowywania danych bez konieczności żądania od użytkownika żadnych uprawnień dotyczących przechowywania:
- Pliki w katalogu dotyczącym aplikacji, do którego dostęp uzyskuje się przy użyciu polecenia
getExternalFilesDir()
. - Zdjęcia, filmy i klipy audio utworzone przez aplikację z magazynu multimediów.
Aby dowiedzieć się więcej o ograniczonym dostępie do pamięci oraz o tym, jak udostępniać pliki zapisane na urządzeniach zewnętrznych i do nich zaglądać oraz je modyfikować, zapoznaj się z poniższymi przewodnikami: Zarządzanie plikami w pamięci zewnętrznej i Dostęp do plików multimedialnych i ich modyfikowanie.
Dostęp do lokalizacji urządzenia w tle wymaga zgody
Aby umożliwić użytkownikom dodatkową kontrolę nad dostępem aplikacji do informacji o lokalizacji, w Androidzie 10 wprowadzono uprawnienie ACCESS_BACKGROUND_LOCATION
.
W przeciwieństwie do uprawnień ACCESS_FINE_LOCATION
i ACCESS_COARSE_LOCATION
uprawnienia ACCESS_BACKGROUND_LOCATION
mają wpływ tylko na dostęp do lokalizacji, gdy aplikacja działa w tle. Aplikacja jest uważana za uzyskującą dostęp do lokalizacji w tle, chyba że spełniony jest jeden z tych warunków:
- Widoczna jest aktywność należąca do aplikacji.
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 wartość atrybutu
targetSdkVersion
lubcompileSdkVersion
na29
lub wyższą. Dowiedz się więcej o tym, jak usługi działające na pierwszym planie mogą kontynuować działania inicjowane przez użytkownika, które wymagają dostępu do lokalizacji.
Jeśli Twoja aplikacja tworzy i monitoruje geoogrodzenia oraz jest kierowana na Androida 10 (API na poziomie 29) lub nowszego, musisz zadeklarować uprawnienie ACCESS_BACKGROUND_LOCATION
.
Dostęp przyznany automatycznie podczas kierowania na Androida 9 lub starszego
Jeśli Twoja aplikacja działa na Androidzie 10 lub nowszym, ale jest kierowana na Androida 9 (poziom interfejsu API 28) lub starszego, platforma działa w ten sposób:
- Jeśli Twoja aplikacja deklaruje element
<uses-permission>
ACCESS_FINE_LOCATION
lubACCESS_COARSE_LOCATION
, system automatycznie dodaje element<uses-permission>
doACCESS_BACKGROUND_LOCATION
podczas instalacji. - Jeśli Twoja aplikacja wysyła żądanie
ACCESS_FINE_LOCATION
lubACCESS_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 zaktualizuje urządzenie z Androida 9 na Androida 10, system automatycznie zaktualizuje zestaw uprawnień przyznanych aplikacji na podstawie lokalizacji. Zestawy uprawnień, które aplikacja otrzyma po aktualizacji, zależą od docelowej wersji pakietu SDK i zdefiniowanych uprawnień, jak pokazano w tabeli poniżej:
Wersja platformy docelowej | Coarse or fine permission granted? |
Czy w pliku manifestu zdefiniowano uprawnienie do działania w tle ? |
Zaktualizowano domyślny stan uprawnień |
---|---|---|---|
Android 10 | Tak | Tak | Dostęp na pierwszym planie i w tle |
Android 10 | Tak | Nie | Tylko dostęp na pierwszym planie |
Android 10 | Nie | (ignorowane przez system) | Brak dostępu |
Android 9 lub starszy | Tak | automatycznie dodawane przez system w momencie uaktualnienia urządzenia; | Dostęp na pierwszym planie i w tle |
Android 9 lub starszy | Nie | (ignorowane przez system) | Brak dostępu |
Użytkownik może zmienić ten poziom dostępu nawet po automatycznej aktualizacji przez system dostępu aplikacji do lokalizacji urządzenia. Użytkownik może na przykład ograniczyć dostęp aplikacji do pierwszego planu lub cofnąć go całkowicie. Zanim aplikacja spróbuje uzyskać dostęp do lokalizacji urządzenia, zwłaszcza w ramach usługi na pierwszym planie, powinna sprawdzić, czy użytkownik nadal zezwala aplikacji na otrzymywanie tych informacji o lokalizacji.
Odmowa dostępu podczas aktualizowania docelowego poziomu interfejsu API na urządzeniach z Androidem 10
Rozważmy sytuację, w której aplikacja jest już zainstalowana na urządzeniu z Androidem 10. Jeśli w tej sytuacji zaktualizujesz aplikację, aby była kierowana na Androida 10, urządzenie cofnie uprawnienie ACCESS_BACKGROUND_LOCATION
.
Więcej informacji na temat pobierania lokalizacji urządzenia, gdy aplikacja działa w tle, znajdziesz w przewodniku po okresowych aktualizacjach lokalizacji.
Ograniczenia dotyczące rozpoczynania działań w tle
Począwszy od Androida 10 system nakłada ograniczenia dotyczące uruchamiania działań w tle. Ta zmiana zachowania pomaga zminimalizować przerwy w pracy użytkownika i daje mu większą kontrolę nad tym, co wyświetla się na ekranie. Jeśli aplikacja uruchamia działania bezpośrednio w wyniku interakcji z użytkownikiem, te ograniczenia prawdopodobnie na nią nie będą miały wpływu.
Więcej informacji o zalecanej alternatywie dla uruchamiania działań w tle znajdziesz w przewodniku, w którym wyjaśniamy, jak informować użytkowników o wydarzeniach związanych z czasem w aplikacji.
Identyfikatory i dane
W tej sekcji wymieniono zmiany dotyczące pracy z identyfikatorami i danymi urządzeń.
Usuwanie podobieństwa kontaktów
Począwszy od Androida 10 platforma nie śledzi informacji o koligacjach kontaktów. W rezultacie, jeśli aplikacja wyszukuje kontakty użytkownika, wyniki nie są sortowane według częstotliwości interakcji.
Przewodnik ContactsProvider
zawiera powiadomienie o szczegółowych polach i metodach, które są przestarzałe na wszystkich urządzeniach od Androida 10.
randomizacja adresów MAC
Na urządzeniach z Androidem 10 lub nowszym system domyślnie przesyła losowe adresy MAC.
Jeśli Twoja aplikacja obsługuje użytkowanie na poziomie przedsiębiorstwa, platforma udostępnia interfejsy API do wykonywania kilku operacji związanych z adresami MAC:
- Uzyskiwanie losowego adresu MAC: aplikacje właściciela urządzenia i aplikacje właściciela profilu mogą pobrać losowy adres MAC przypisany do konkretnej sieci, wywołując funkcję
getRandomizedMacAddress()
. - Uzyskiwanie rzeczywistego fabrycznego adresu MAC: aplikacje właściciela urządzenia mogą pobrać rzeczywisty adres MAC sprzętu urządzenia, wywołując funkcję
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 funkcji /proc/net
, która zawiera informacje o stanie sieci urządzenia. Aplikacje, które potrzebują dostępu do tych informacji (np. sieci VPN), powinny używać klasy NetworkStatsManager
lub ConnectivityManager
.
Ograniczenia dotyczące identyfikatorów urządzeń, których nie można zresetować
Od Androida 10 aplikacje muszą mieć uprawnienia READ_PRIVILEGED_PHONE_STATE
, aby uzyskać dostęp do niezerujących się identyfikatorów urządzenia, w tym numeru IMEI i numeru seryjnego.
Dotyczy to tych metod:
Build
TelephonyManager
Jeśli Twoja aplikacja nie ma uprawnień i próbuje uzyskać informacje o identyfikatorach, których nie można zresetować, odpowiedź platformy będzie się różnić w zależności od wersji docelowego pakietu SDK:
- Jeśli Twoja aplikacja jest kierowana na Androida 10 lub nowszego, wystąpi błąd
SecurityException
. - Jeśli Twoja aplikacja jest kierowana na Androida 9 (poziom API 28) lub niższego, metoda zwraca
null
lub dane zastępcze, jeśli aplikacja ma uprawnienieREAD_PHONE_STATE
. W przeciwnym razie występujeSecurityException
.
W wielu przypadkach nie trzeba stosować nieusuwanych identyfikatorów urządzeń. Jeśli na przykład Twoja aplikacja używa identyfikatorów urządzeń, których nie można zresetować, do śledzenia reklam lub analizowania użytkowników, w tych konkretnych przypadkach użyj identyfikatora wyświetlania reklam na Androida. Więcej informacji znajdziesz w artykule Sprawdzone metody dotyczące unikalnych identyfikatorów.
Ograniczony dostęp do danych ze schowka
Jeśli Twoja aplikacja nie jest domyślnym edytorem metody wprowadzania (IME) ani aplikacją, która jest obecnie aktywna, nie może uzyskać dostępu do danych z bufora wymiany na Androidzie 10 lub nowszym.
Ochrona numeru seryjnego urządzenia USB
Jeśli Twoja aplikacja jest przeznaczona na Androida 10 lub nowszego, nie może odczytać numeru seryjnego, dopóki użytkownik nie przyzna jej uprawnień dostępu do urządzenia USB lub akcesorium.
Więcej informacji o pracy z urządzeniami USB znajdziesz w przewodniku konfigurowania hostów USB.
Kamera i łączność
Ta sekcja zawiera listę zmian dotyczących interfejsów API metadanych aparatu i interfejsów API łączności.
Ograniczenie dostępu do szczegółów i metadanych aparatu
Android 10 zmienia zakres informacji zwracanych domyślnie przez metodę getCameraCharacteristics()
. W szczególności aplikacja musi mieć uprawnienie CAMERA
, aby uzyskać dostęp do metadanych, które mogą być związane z danym urządzeniem i znajdują się w wartości zwracanej przez tę metodę.
Więcej informacji o tych zmianach znajdziesz w sekcji poświęconej polom aparatu, które wymagają uprawnień.
Ograniczenie 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 wartość false
.
Jeśli chcesz poprosić użytkowników o włączenie i wyłączenie Wi-Fi, użyj panelu ustawień.
Ograniczenia dostępu bezpośredniego do skonfigurowanych sieci Wi-Fi
Aby chronić prywatność użytkownika, ręczna konfiguracja listy sieci Wi-Fi jest ograniczona do aplikacji systemowych i kontrolerów zasad dotyczących urządzeń. Użytkownik DPC może być właścicielem urządzenia lub właścicielem profilu.
Jeśli Twoja aplikacja jest kierowana na Androida 10 lub nowszego, a nie jest aplikacją systemową ani DPC, poniższe metody nie zwracają przydatnych danych:
Metoda
getConfiguredNetworks()
zawsze zwraca pustą listę.Każda metoda operacji sieci, która zwraca wartość całkowitą (
addNetwork()
iupdateNetwork()
), zwraca zawsze -1.Każda operacja sieciowa zwracająca wartość logiczną (
removeNetwork()
,reassociate()
,enableNetwork()
,disableNetwork()
,reconnect()
idisconnect()
) zawsze zwracafalse
.
Jeśli aplikacja musi łączyć się z sieciami Wi-Fi, użyj tych alternatywnych metod:
- Aby uruchomić błyskawiczne połączenie lokalne z siecią Wi-Fi, użyj parametru
WifiNetworkSpecifier
w standardowym obiekcieNetworkRequest
. - Aby dodać sieci Wi-Fi, które mogą być używane do zapewnienia użytkownikowi dostępu do internetu, użyj obiektów
WifiNetworkSuggestion
. Sieci, które pojawiają się w oknie wyboru sieci do automatycznego łączenia, możesz dodawać i usuwać, wywołując odpowiednio metodyaddNetworkSuggestions()
iremoveNetworkSuggestions()
. Te metody nie wymagają uprawnień do lokalizacji.
Niektóre interfejsy API telefonów, Bluetooth i Wi-Fi wymagają uprawnienia do dokładnej lokalizacji
Jeśli Twoja aplikacja jest kierowana na Androida 10 lub nowszego, musi mieć uprawnienie ACCESS_FINE_LOCATION
, aby można było korzystać z kilku metod w interfejsach API Wi-Fi, Wi-Fi Aware lub Bluetooth. W sekcjach poniżej znajdziesz listę klas i metod, których dotyczy problem.
Połączenia telefoniczne
TelephonyManager
getCellLocation()
getAllCellInfo()
requestNetworkScan()
requestCellInfoUpdate()
getAvailableNetworks()
getServiceState()
TelephonyScanManager
requestNetworkScan()
TelephonyScanManager.NetworkScanCallback
onResults()
PhoneStateListener
onCellLocationChanged()
onCellInfoChanged()
onServiceStateChanged()
Wi-Fi
WifiManager
startScan()
getScanResults()
getConnectionInfo()
getConfiguredNetworks()
WifiAwareManager
WifiP2pManager
WifiRttManager
Bluetooth
BluetoothAdapter
startDiscovery()
startLeScan()
BluetoothAdapter.LeScanCallback
BluetoothLeScanner
startScan()
Uprawnienia
W tej sekcji opisano zmiany w modelu uprawnień na Androidzie.
Ograniczony dostęp do zawartości ekranu
Aby chronić zawartość ekranu użytkowników, Android 10 uniemożliwia niejawny 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 ramach dostępu na podstawie podpisu.
Aplikacje, które muszą mieć dostęp do zawartości ekranu urządzenia, powinny używać interfejsu API MediaProjection
, który wyświetla prośbę o udzielenie zgody.
Sprawdzanie uprawnień w aplikacji w interakcji z użytkownikiem w przypadku starszych aplikacji
Jeśli Twoja aplikacja jest przeznaczona na Androida 5.1 (poziom interfejsu API 22) lub starszego, użytkownicy uruchamiający ją po raz pierwszy na urządzeniu z Androidem 10 lub nowszym zobaczą ekran uprawnień, jak pokazano na rysunku 1. Na tym ekranie użytkownicy mogą anulować dostęp do uprawnień, które system przyznał aplikacji podczas instalacji.
Rozpoznawanie aktywności fizycznej
Android 10 wprowadza uprawnienia czasu działania android.permission.ACTIVITY_RECOGNITION
w przypadku aplikacji, które muszą wykrywać liczbę kroków użytkownika lub klasyfikować jego aktywność fizyczną, taką jak chodzenie, jazda na rowerze czy poruszanie się pojazdem. Ma to na celu umożliwienie użytkownikom sprawdzenia, jak dane z czujników urządzenia są używane w Ustawieniach.
Niektóre biblioteki w usługach Google Play, takie jak interfejs Activity Recognition API i interfejs Google Fit API, nie dostarczają wyników, chyba że użytkownik przyznał Twojej aplikacji odpowiednie uprawnienia.
Jedynymi wbudowanymi czujnikami na urządzeniu, które wymagają zadeklarowania tego uprawnienia, są czujniki licznika kroków i detektora kroków.
Jeśli Twoja aplikacja jest kierowana na Androida 9 (poziom API 28) lub niższą wersję, system automatycznie przyznaje jej uprawnienia 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-auto przyznaje uprawnienie android.permission.ACTIVITY_RECOGNITION
, aplikacja zachowa to uprawnienie po zaktualizowaniu jej do wersji na Androida 10. Użytkownik może jednak w każdej chwili cofnąć to uprawnienie w ustawieniach systemu.
Grupy uprawnień zostały usunięte z interfejsu użytkownika
Od Androida 10 aplikacje nie mogą sprawdzać, jak uprawnienia są grupowane w interfejsie.