Zminimalizuj liczbę próśb o przyznanie uprawnień

W ramach poprawy jakości aplikacji i ochrony prywatności użytkowników zalecamy ograniczenie wykorzystania uprawnień w aplikacjach. Pomaga to użytkownikom odkrywać i używać aplikacji wysokiej jakości, które zapewniają bezpieczne środowisko.

Prośba o uprawnienia od użytkowników przerywa ich działanie, a użytkownicy mogą odrzucić Twoją prośbę. Dodatkowo za każdym razem, gdy zadeklarujesz nowe uprawnienie, musisz sprawdzić, w jaki sposób aplikacja prosi o dane użytkownika i jak je udostępnia. Niektóre szczególnie wrażliwe uprawnienia i interfejsy API wymagają wyjaśnienia w aplikacji, w jaki sposób uzyskiwany jest dostęp do danych oraz jak są one zbierane, wykorzystywane i udostępniane.

Istnieje kilka alternatywnych sposobów na ograniczenie wykorzystania uprawnień:

  • Zadeklaruj uprawnienia, które zapewniają informacje o przybliżonej lokalizacji, a nie o dokładnej, jeśli aplikacja potrzebuje tylko przybliżonej lokalizacji.
  • wywoływać interfejsy API, które umożliwiają aplikacji wykonywanie żądanej funkcji bez deklarowania uprawnień;
  • wywoływać określone intencje lub moduły obsługi zdarzeń w celu wykonywania funkcji zamiast deklarowania uprawnień;
  • System udostępnia wbudowane kontrakty dla różnych operacji na plikach, a także obsługuje kontrakty niestandardowe.

Jeśli musisz zadeklarować uprawnienie, zawsze respektuj decyzję użytkownika i zapewnij możliwość łagodnego ograniczenia funkcjonalności aplikacji.

Na tej stronie opisujemy kilka przypadków użycia, w których Twoja aplikacja może działać bez deklarowania potrzeby uzyskania jakichkolwiek uprawnień.

Pokaż miejsca w pobliżu

Aplikacja może potrzebować przybliżonej lokalizacji użytkownika. Jest to przydatne do wyświetlania informacji zależnych od lokalizacji, takich jak pobliskie restauracje.

W niektórych przypadkach wystarczy przybliżone oszacowanie lokalizacji urządzenia. W takich sytuacjach wykonaj jedną z tych czynności, w zależności od tego, jak często aplikacja potrzebuje informacji o lokalizacji:

  • Jeśli Twoja aplikacja często potrzebuje dostępu do 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 Twoja aplikacja potrzebuje lokalizacji rzadziej lub tylko raz, rozważ poproszenie użytkownika o wpisanie adresu lub kodu pocztowego.

Inne przypadki użycia wymagają dokładniejszego oszacowania lokalizacji urządzenia. To jedyne sytuacje, w których 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

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ń w czasie działania. Gdy użytkownik wchodzi w interakcję z selektorem zdjęć, aby wybrać zdjęcia lub filmy do udostępnienia w aplikacji, system przyznaje tymczasowy dostęp do odczytu identyfikatora URI powiązanego z wybranymi plikami multimedialnymi.

Jeśli Twoja aplikacja musi mieć dostęp do plików multimedialnych bez używania selektora zdjęć, nie musisz deklarować żadnych uprawnień do pamięci:

  • Jeśli uzyskujesz dostęp do plików multimedialnych utworzonych przez aplikację, ma ona 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 Storage Access Framework.

Otwieranie dokumentów

Aplikacja może wyświetlać dokumenty utworzone przez użytkownika w niej lub w innej aplikacji. Typowym przykładem jest plik tekstowy.

W takiej sytuacji zadeklaruj READ_EXTERNAL_STORAGE tylko w celu zapewnienia zgodności ze starszymi urządzeniami. Ustaw wartość android:maxSdkVersion na 28.

W zależności od tego, w której aplikacji utworzono dokument, wykonaj jedną z tych czynności:

Zrób zdjęcie

Użytkownicy mogą robić zdjęcia w Twojej aplikacji za pomocą wstępnie zainstalowanej aplikacji aparatu systemowego.

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ą wstępnie zainstalowanej aplikacji systemowej Aparat.

W takiej sytuacji nie deklaruj uprawnienia CAMERA. Zamiast tego wywołaj działanie intencji ACTION_VIDEO_CAPTURE.

określać urządzenie, na którym działa instancja aplikacji;

Konkretna instancja aplikacji może potrzebować informacji o urządzeniu, na którym jest uruchomiona. Jest to przydatne w przypadku aplikacji, które mają ustawienia lub wiadomości specyficzne dla urządzenia, np. różne playlisty na urządzenia telewizyjne i urządzenia do noszenia.

W takiej sytuacji nie uzyskuj bezpośrednio dostępu do numeru IMEI urządzenia. W Androidzie 10 i nowszych nie jest to możliwe. Zamiast tego wykonaj jedną z tych czynności:

  • Pobierz unikalny identyfikator urządzenia dla instancji aplikacji za pomocą biblioteki Instance ID.
  • Utwórz własny identyfikator ograniczony do pamięci aplikacji. Używaj podstawowych funkcji systemowych, takich jak randomUUID().

Parowanie z urządzeniem przez Bluetooth

Aplikacja może oferować większe możliwości, przesyłając dane na inne urządzenie 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ądzenia towarzyszącego.

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

Usługi Androida i usługi Google Play udostępniają 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, 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 interfejsu API 26) lub nowszego, wygeneruj token specyficzny dla aplikacji za pomocą 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 korzystanie z interfejsu Digital Credentials API. Korzystanie z tego interfejsu API bezpośrednio lub za pomocą wielu zgodnych agregatorów umożliwia wiarygodne weryfikowanie informacji o koncie użytkownika bez konieczności proszenia o newralgiczne uprawnienia na urządzeniu. 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 pomoc, 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 w pracy użytkownika, 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 API CallScreeningService.

Wykonywanie połączeń telefonicznych

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 działania ACTION_CALL. ACTION_CALL wymaga uprawnienia CALL_PHONE, które jest przyznawane w momencie instalacji. Uniemożliwia to instalowanie aplikacji na urządzeniach, które nie mogą wykonywać połączeń, np. na niektórych tabletach.

Wstrzymywanie multimediów, gdy aplikacja jest przerywana

Jeśli użytkownik odbierze połączenie telefoniczne lub włączy alarm, aplikacja powinna wstrzymać odtwarzanie multimediów do momentu, gdy odzyska aktywność audio.

Aby obsługiwać tę funkcję, nie deklaruj uprawnienia READ_PHONE_STATE. Zamiast tego zaimplementuj moduł obsługi zdarzeń onAudioFocusChange(), który jest uruchamiany automatycznie, gdy system zmienia aktywność audio. Dowiedz się więcej o wdrażaniu funkcji ostrości dźwięku.

Skanowanie kodów kreskowych

Android obsługuje interfejs Google Code Scanner API, który jest częścią usług 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ł(-a) tworzyć niestandardowy interfejs do skanowania kodów kreskowych.

Interfejs API skanuje kod kreskowy i zwraca do aplikacji tylko wyniki skanowania. 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 API do skanowania kodów kreskowych ML Kit.

Resetowanie nieużywanych uprawnień

Android udostępnia kilka sposobów na zresetowanie nieużywanych uprawnień środowiska wykonawczego do domyślnego stanu odmowy.

Zapoznaj się ze wskazówkami dotyczącymi projektowania.

Wysyłanie prośby o uprawnienia w czasie działania

Gdy stwierdzisz, że Twoja aplikacja musi deklarować uprawnienia w czasie działania i o nie prosić, wykonaj odpowiednie czynności.

Zapoznaj się ze wskazówkami dotyczącymi projektowania.

Wyjaśnij, dlaczego Twoja aplikacja potrzebuje uprawnień

Użycie requestPermissions() wyświetla okno z informacją o tym, jakich uprawnień chce używać Twoja aplikacja, ale nie wyjaśnia, dlaczego, co może być dla użytkownika niezrozumiałe.

Więcej informacji i zaleceń dotyczących tego, jak i kiedy wyświetlać to okno, znajdziesz w przewodniku po projektowaniu.

Obsługa odmów przyznania uprawnień

Aplikacja powinna informować użytkowników o konsekwencjach odmowy przyznania uprawnień przed podjęciem przez nich decyzji i po jej podjęciu.

Zapoznaj się ze wskazówkami dotyczącymi projektowania.