Zmiany w ochronie prywatności w Androidzie 10

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ą:

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 targetSdkVersion lub compileSdkVersion aplikacji na 29 lub 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> dla ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION, system automatycznie dodaje element <uses-permission> dla ACCESS_BACKGROUND_LOCATION podczas instalacji.
  • Jeśli aplikacja prosi o ACCESS_FINE_LOCATION lub ACCESS_COARSE_LOCATION, system automatycznie dodaje do żądania ACCESS_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:

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ść null lub dane zastępcze, jeśli aplikacja ma uprawnienie READ_PHONE_STATE. W przeciwnym razie wystąpi SecurityException.

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:

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 WifiNetworkSpecifier w standardowym obiekcie NetworkRequest.
  • 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 funkcje addNetworkSuggestions() i removeNetworkSuggestions(). 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

Wi-Fi

Bluetooth

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.

Zrzut ekranu okna dialogowego
Rysunek 1. Okno dla użytkownika, które umożliwia sprawdzenie starszych uprawnień

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.