W ramach poprawy jakości aplikacji i ochrony prywatności użytkowników zalecamy ograniczenie użycia uprawnień w aplikacjach. Pomaga to użytkownikom odkrywać i używać aplikacji wysokiej jakości, które zapewniają bezpieczne środowisko.
Prośby o uprawnienia przerywają użytkownikom korzystanie z aplikacji, a użytkownicy mogą odmówić przyznania uprawnień. Ponadto za każdym razem, gdy deklarujesz nowe uprawnienie, musisz sprawdzić, jak Twoja aplikacja prosi o dane użytkownika i jak je udostępnia. Niektóre szczególnie newralgiczne uprawnienia i interfejsy API wymagają, aby w aplikacji znajdowało się wyjaśnienie dotyczące dostępu do danych oraz ich zbierania, używania i udostępniania.
Istnieje kilka alternatywnych sposobów na ograniczenie użycia uprawnień:
- W stosownych przypadkach używaj alternatywnych rozwiązań o niższej dokładności, które wymagają dostępu do danych użytkownika, np. zamiast dokładnej lokalizacji proś o przybliżoną lokalizację, gdy nie jest potrzebna dokładna lokalizacja.
- Używaj selektorów i alternatywnych rozwiązań, które przyznają dostęp do newralgicznych uprawnień w ograniczonych okolicznościach, np. selektora zdjęć, selektora kontaktów i przycisku lokalizacji.
- Wywołuj interfejsy API, które pozwalają aplikacji wykonywać wybraną funkcję bez deklarowania uprawnień.
- Zamiast deklarować uprawnienia, wywołuj konkretne intencje lub procedury obsługi zdarzeń, aby wykonywać funkcje.
- System udostępnia wbudowane umowy dotyczące różnych operacji na plikach a także obsługuje umowy niestandardowe.
Jeśli musisz zadeklarować uprawnienie, zawsze szanuj decyzję użytkownika i zapewnij sposób na płynne ograniczenie funkcjonalności aplikacji.
Na tej stronie opisujemy kilka przypadków użycia, które Twoja aplikacja może realizować bez deklarowania potrzeby uzyskania jakichkolwiek uprawnień.
Pokazywanie miejsc w pobliżu
Twoja aplikacja może potrzebować przybliżonej lokalizacji użytkownika. Jest to przydatne do wyświetlania informacji zależnych od lokalizacji, takich jak pobliskie restauracje. Każdy przypadek użycia lokalizacji ma własny zestaw wymagań dotyczących dokładności i czasu dostępu. W większości przypadków wystarczy przybliżona lokalizacja użytkownika. Jeśli implementujesz w aplikacji funkcję, która zależy od lokalizacji użytkownika, rozważ te opcje, aby wybrać odpowiedni sposób dostępu.
- Jeśli funkcje aplikacji wymagają dokładnej lokalizacji, ale tylko w określonym momencie podczas korzystania z aplikacji, np. w przypadku wyszukiwania „w pobliżu” lub automatycznego uzupełniania adresu w e-commerce, najlepszym rozwiązaniem będzie użycie przycisku lokalizacji. Pozwoli to zmniejszyć zarówno niedogodności dla użytkownika, jak i zależność od uprawnień o szerszym zakresie.
- Jeśli aplikacja często potrzebuje lokalizacji, zadeklaruj uprawnienie
ACCESS_COARSE_LOCATION. To uprawnienie podaje szacunkową lokalizację urządzenia na podstawie usług lokalizacyjnych, zgodnie z opisem w dokumentacji dotyczącej dokładności przybliżonej lokalizacji. - Jeśli aplikacja potrzebuje lokalizacji rzadziej lub tylko raz, poproś użytkownika o podanie adresu lub kodu pocztowego.
Inne przypadki użycia mogą wymagać dokładniejszego oszacowania lokalizacji urządzenia.
W takich sytuacjach można zadeklarować uprawnienie
ACCESS_FINE_LOCATION.
Tworzenie plików i uzyskiwanie do nich dostępu
Android umożliwia tworzenie plików i uzyskiwanie do nich dostępu bez konieczności deklarowania uprawnień związanych z pamięcią lub czujnikami.
Otwieranie plików multimedialnych
Twoja aplikacja może umożliwiać użytkownikom wybieranie zdjęć i filmów, np. jako załączników do wiadomości lub zdjęć profilowych.
Aby obsługiwać tę funkcję, użyj selektora zdjęć. Selektor zdjęć nie wymaga żadnych uprawnień czasu działania. Gdy użytkownik wybierze zdjęcia lub filmy do udostępnienia w Twojej aplikacji, system przyzna tymczasowy dostęp do odczytu identyfikatora URI powiązanego z wybranymi plikami multimedialnymi.
Jeśli aplikacja musi mieć dostęp do plików multimedialnych bez użycia selektora zdjęć, nie musisz deklarować żadnych uprawnień do pamięci:
- Jeśli uzyskujesz dostęp do plików multimedialnych utworzonych przez Twoją aplikację, aplikacja ma już dostęp do tych plików w magazynie multimediów.
- Jeśli uzyskujesz dostęp do plików multimedialnych utworzonych przez inne aplikacje, użyj platformy Storage Access Framework.
Otwieranie dokumentów
Twoja aplikacja może wyświetlać dokumenty utworzone przez użytkownika w Twojej aplikacji lub w innej aplikacji. Częstym przykładem jest plik tekstowy.
W takiej sytuacji zadeklaruj READ_EXTERNAL_STORAGE tylko w celu zapewnienia
zgodności ze starszymi urządzeniami. Ustaw android:maxSdkVersion na 28.
W zależności od tego, która aplikacja utworzyła dokument, wykonaj jedną z tych czynności:
- Jeśli użytkownik utworzył dokument w Twojej aplikacji, uzyskaj do niego bezpośredni dostęp.
- Jeśli użytkownik utworzył dokument w innej aplikacji, użyj Storage Access Framework.
Zrób zdjęcie
Użytkownicy mogą robić zdjęcia w Twojej aplikacji za pomocą preinstalowanej systemowej aplikacji aparatu.
W takiej sytuacji nie deklaruj uprawnienia CAMERA. Zamiast tego wywołaj działanie intencji ACTION_IMAGE_CAPTURE.
Nagraj film
Użytkownicy mogą nagrywać filmy w Twojej aplikacji za pomocą preinstalowanej systemowej aplikacji aparatu.
W takiej sytuacji nie deklaruj uprawnienia CAMERA. Zamiast tego wywołaj działanie intencji ACTION_VIDEO_CAPTURE.
Identyfikowanie urządzenia, na którym działa instancja aplikacji
Określona instancja aplikacji może potrzebować informacji o tym, na jakim urządzeniu działa. Jest to przydatne w przypadku aplikacji, które mają preferencje lub wiadomości specyficzne dla urządzenia, np. różne playlisty na telewizorach i urządzeniach do noszenia.
W takiej sytuacji nie uzyskuj bezpośredniego dostępu do numeru IMEI urządzenia. Od Androida 10 nie jest to możliwe. Zamiast tego wykonaj jedną z tych czynności:
- Uzyskaj unikalny identyfikator urządzenia dla instancji aplikacji za pomocą biblioteki Instance ID.
- Utwórz własny identyfikator, który będzie ograniczony do pamięci aplikacji. Używaj podstawowych
funkcji systemowych, takich jak
randomUUID().
Parowanie z urządzeniem przez Bluetooth
Twoja aplikacja może oferować lepsze wrażenia dzięki przesyłaniu danych do innego urządzenia przez Bluetooth.
Aby obsługiwać tę funkcję, nie deklaruj uprawnień ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATIION ani BLUETOOTH_ADMIN. Zamiast tego użyj
parowania urządzeń towarzyszących.
Automatyczne wpisywanie numeru karty płatniczej
Usługi Google Play oferują bibliotekę, która umożliwia automatyczne wpisywanie numeru karty płatniczej. Zamiast deklarować uprawnienie CAMERA, możesz użyć
biblioteki rozpoznawania kart debetowych i kredytowych.
Zarządzanie połączeniami telefonicznymi i SMS-ami
Android i usługi Google Play oferują biblioteki, które umożliwiają zarządzanie połączeniami telefonicznymi i SMS-ami bez konieczności deklarowania uprawnień związanych z połączeniami telefonicznymi lub SMS-ami.
Automatyczne wpisywanie jednorazowego kodu dostępu
Aby usprawnić proces uwierzytelniania dwuskładnikowego, Twoja aplikacja może automatycznie wpisywać jednorazowy kod dostępu wysyłany na urządzenie użytkownika w celu potwierdzenia jego tożsamości.
Aby obsługiwać tę funkcję na urządzeniach z usługami Google Play, nie deklaruj uprawnienia READ_SMS. Zamiast tego użyj interfejsu SMS Retriever API.
Na innych urządzeniach, jeśli Twoja aplikacja jest kierowana na Androida 8.0 (poziom API 26) lub nowszego,
wygeneruj token specyficzny dla aplikacji za pomocą funkcji createAppSpecificSmsToken(). Przekaż ten token do innej aplikacji lub usługi, która może wysłać SMS-a weryfikacyjnego.
Weryfikowanie numeru telefonu użytkownika
Aby umożliwić aplikacji bezpieczne weryfikowanie numeru telefonu użytkownika, zalecamy użycie interfejsu Digital Credentials API. Korzystanie z tego interfejsu API bezpośrednio lub za pomocą wielu zgodnych agregatorów umożliwia niezawodne weryfikowanie informacji o koncie użytkownika bez konieczności proszenia o newralgiczne uprawnienia urządzenia. W przypadku rozwiązania Firebase zapoznaj się z artykułem Weryfikacja numeru telefonu w Firebase.
Możesz też zweryfikować numer telefonu użytkownika za pomocą jednorazowego kodu dostępu, korzystając z interfejsu SMS Retriever API.
Automatyczne wpisywanie numeru telefonu użytkownika
Aby zapewnić bardziej efektywną sprzedaż lub obsługę, Twoja aplikacja może umożliwiać użytkownikowi automatyczne wpisywanie numeru telefonu urządzenia.
Aby obsługiwać tę funkcję na urządzeniach z usługami Google Play, nie deklaruj uprawnienia READ_PHONE_STATE. Zamiast tego użyj biblioteki Phone Number
Hint.
Filtrowanie połączeń telefonicznych
Aby zminimalizować niepotrzebne przerwy dla użytkownika, Twoja aplikacja może filtrować połączenia telefoniczne pod kątem spamu.
Aby obsługiwać tę funkcję, nie deklaruj uprawnienia READ_PHONE_STATE.
Zamiast tego użyj interfejsu CallScreeningService API.
Nawiązywanie połączeń telefonicznych
Twoja aplikacja może umożliwiać nawiązywanie połączeń telefonicznych przez kliknięcie informacji o kontakcie.
Aby obsługiwać tę funkcję, użyj działania intencji ACTION_DIAL zamiast ACTION_CALL. ACTION_CALL wymaga uprawnienia CALL_PHONE przyznawanego podczas instalacji, co uniemożliwia instalowanie aplikacji na urządzeniach, które nie mogą nawiązywać połączeń, np. na niektórych tabletach.
Wstrzymywanie multimediów, gdy aplikacja zostanie przerwana
Jeśli użytkownik odbierze połączenie telefoniczne lub jeśli włączy się alarm skonfigurowany przez użytkownika, Twoja aplikacja powinna wstrzymać odtwarzanie multimediów do czasu, aż odzyska aktywność audio.
Aby obsługiwać tę funkcję, nie deklaruj uprawnienia READ_PHONE_STATE.
Zamiast tego zaimplementuj procedurę obsługi zdarzeń onAudioFocusChange(), która uruchamia się automatycznie, gdy system zmienia aktywność audio. Dowiedz się więcej o implementowaniu aktywności audio.
Skanowanie kodów kreskowych
Android obsługuje interfejs Google Code Scanner API, który jest oparty na usługach Google Play i umożliwia dekodowanie kodów kreskowych bez deklarowania uprawnień do aparatu. Ten interfejs API pomaga chronić prywatność użytkowników i zmniejsza prawdopodobieństwo, że będziesz musiał utworzyć niestandardowy interfejs do skanowania kodów kreskowych.
Interfejs API skanuje kod kreskowy i zwraca wyniki skanowania tylko do Twojej aplikacji. Obrazy są przetwarzane na urządzeniu, a Google nie przechowuje żadnych danych ani wyników skanowania.
Jeśli Twoja aplikacja musi obsługiwać złożone przypadki użycia lub formaty kodów kreskowych albo wymaga niestandardowego interfejsu, użyj interfejsu ML Kit barcode scanning API zamiast tego.
Resetowanie nieużywanych uprawnień
Android udostępnia kilka sposobów na zresetowanie nieużywanych uprawnień czasu działania do stanu domyślnego (odmowa).
Przeczytaj wskazówki dotyczące projektowania.
Wysyłanie prośby o uprawnienia czasu działania
Gdy stwierdzisz, że Twoja aplikacja musi deklarować uprawnienia czasu działania i prosić o nie, wykonaj odpowiednie czynności.
Przeczytaj wskazówki dotyczące projektowania.
Wyjaśnianie, dlaczego aplikacja potrzebuje uprawnień
Użycie funkcji requestPermissions() powoduje wyświetlenie okna dialogowego z informacją o tym, jakich uprawnień chce używać Twoja aplikacja, ale nie wyjaśnia, dlaczego. Może to być dla użytkownika niezrozumiałe.
Więcej informacji i zaleceń dotyczących tego, jak i kiedy wyświetlać to okno dialogowe, znajdziesz we wskazówkach dotyczących projektowania.
Obsługa odmowy przyznania uprawnień
Twoja aplikacja powinna pomagać użytkownikom w zrozumieniu konsekwencji odmowy przyznania uprawnień przed i po podjęciu decyzji.
Przeczytaj wskazówki dotyczące projektowania.