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. Te funkcje mogą powodować, że określone zachowania lub dane, których używa Twoja aplikacja, będą działać inaczej niż w starszych wersjach platformy. Wpływ na Twoją aplikację powinien być minimalny, jeśli stosuje ona aktualne najlepsze praktyki dotyczące 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 lub nowszego mają ograniczony dostęp do pamięci zewnętrznej lub ograniczoną pamięć. 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ń związanych z przechowywaniem:
- pliki w katalogu aplikacji, do których uzyskuje się dostęp za pomocą
getExternalFilesDir()
; - Zdjęcia, filmy i klipy audio utworzone przez aplikację w sklepie ze zdjęciami i filmami.
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 poradnikami dotyczącymi zarządzania plikami w pamięci zewnętrznej oraz dostępu do plików multimedialnych i ich modyfikacji.
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 aplikacji podczas działania 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:
- 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 wartość atrybutu
targetSdkVersion
lubcompileSdkVersion
na29
lub wyższą. Dowiedz się więcej o tym, jak usługi na pierwszym planie mogą kontynuować działania wywoływane 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 tej tabeli:
Wersja platformy docelowej | Coarse or fine permission granted? |
Czy w pliku manifestu zdefiniowano uprawnienia do działania w tle ? |
Zaktualizowany 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 o pobieraniu lokalizacji urządzenia, gdy aplikacja działa w tle, znajdziesz w przewodniku o 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 jej nie dotyczą.
Więcej informacji o zalecanej alternatywie dla uruchamiania działań w tle znajdziesz w przewodniku o ostrzeganiu 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
Od Androida 10 platforma nie śledzi informacji o powiązaniach 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 konkretnych polach i metodach, które są przestarzałe na wszystkich urządzeniach od Androida 10.
losowanie 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 /proc/net
, który zawiera informacje o stanie sieci urządzenia. Aplikacje, które potrzebują dostępu do tych informacji, takie jak 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 IMEI i numeru seryjnego.
Dotyczy to tych metod:
Build
TelephonyManager
Jeśli Twoja aplikacja nie ma uprawnień, a i tak próbujesz 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ąpi błądSecurityException
.
W wielu przypadkach nie trzeba stosować nieusuwanych identyfikatorów urządzeń. Jeśli na przykład Twoja aplikacja używa identyfikatorów urządzenia, których nie można zresetować, do śledzenia reklam lub analizowania użytkowników, w takich 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 Konfigurowanie hostów USB.
Kamera i łączność
Ta sekcja zawiera listę zmian dotyczących interfejsów API metadanych i połączeń aparatu.
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 tej metody.
Więcej informacji o tych zmianach znajdziesz w sekcji Pola dotyczące 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, aby użytkownicy mogli włączać i wyłączać Wi-Fi, użyj panelu ustawień.
Ograniczenia dostępu bezpośredniego do skonfigurowanych sieci Wi-Fi
Aby chronić prywatność użytkowników, ręczna konfiguracja listy sieci Wi-Fi jest ograniczona do aplikacji systemowych i sterowników zasad urządzenia (DPC). 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 Twoja aplikacja musi łączyć się z sieciami Wi-Fi, użyj tych alternatywnych metod:
- Aby wywołać natychmiastowe połączenie lokalne z siecią Wi-Fi, użyj obiektu
WifiNetworkSpecifier
w obiekcie standardowymNetworkRequest
. - Aby dodać sieci Wi-Fi, które mogą być brane pod uwagę jako źródło dostępu do internetu dla użytkownika, 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 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ą uzyskać dostęp do zawartości ekranu urządzenia, powinny używać interfejsu API MediaProjection
, który wyświetla prośbę o zgodę użytkownika.
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ą cofnąć uprawnienia, które system przyznał aplikacji w momencie instalacji.
Rozpoznawanie aktywności fizycznej
Android 10 wprowadza uprawnienie android.permission.ACTIVITY_RECOGNITION
w czasie działania 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. 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ższego, 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
Od Androida 10 aplikacje nie mogą sprawdzać, jak uprawnienia są grupowane w interfejsie.