Poproś o dostęp do lokalizacji

Aby chronić prywatność użytkowników, aplikacje korzystające z usług lokalizacyjnych muszą prosić o przyznanie uprawnień do lokalizacji.

Z lokalizacją powiązanych jest kilka uprawnień. O jakie uprawnienia prosisz i w jaki sposób to robisz, zależy od wymagań dotyczących lokalizacji w przypadku użycia aplikacji.

Na tej stronie opisujemy różne typy wymagań dotyczących lokalizacji i wyjaśniamy, jak w każdym przypadku poprosić o uprawnienia do lokalizacji.

Aby poprosić o uprawnienia do lokalizacji, postępuj zgodnie ze sprawdzonymi metodami dotyczącymi wszystkich uprawnień w czasie działania.

Rodzaje dostępu do lokalizacji

Każde uprawnienie ma kombinację tych cech:

Lokalizacja na pierwszym planie

Jeśli aplikacja zawiera funkcję, która udostępnia lub odbiera informacje o lokalizacji tylko raz albo przez określony czas, wymaga ona dostępu do lokalizacji na pierwszym planie. Oto kilka przykładów:

  • W aplikacji do nawigacji funkcja umożliwia użytkownikom uzyskiwanie szczegółowych wskazówek dojazdu.
  • W aplikacji do obsługi wiadomości funkcja umożliwia użytkownikom udostępnianie bieżącej lokalizacji innemu użytkownikowi.

System uznaje, że aplikacja korzysta z lokalizacji na pierwszym planie, jeśli funkcja aplikacji uzyskuje dostęp do bieżącej lokalizacji urządzenia w jednej z tych sytuacji:

  • Widoczna jest aktywność należąca do Twojej aplikacji.
  • Aplikacja działa jako usługa na pierwszym planie. Gdy usługa na pierwszym planie jest uruchomiona, system informuje o tym użytkownika, wyświetlając trwałe powiadomienie. Aplikacja zachowuje dostęp, gdy jest w tle, np. gdy użytkownik naciśnie przycisk Ekran główny na urządzeniu lub wyłączy wyświetlacz urządzenia.

    Dodatkowo musisz zadeklarować typ usługi na pierwszym planie location, jak pokazano w tym fragmencie kodu. W przypadku Androida 10 (API na poziomie 29) i nowszych wersji musisz zadeklarować ten typ usługi na pierwszym planie.

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29) and higher. -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

Potrzebę dostępu do lokalizacji na pierwszym planie deklarujesz, gdy aplikacja prosi o uprawnienie ACCESS_COARSE_LOCATION lub ACCESS_FINE_LOCATION, jak pokazano w tym fragmencie kodu:

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Lokalizacja w tle

Aplikacja wymaga dostępu do lokalizacji w tle, jeśli funkcja w niej zawarta stale udostępnia lokalizację innym użytkownikom lub korzysta z interfejsu Geofencing API. Oto kilka przykładów:

  • W aplikacji do udostępniania lokalizacji w grupie rodzinnej funkcja umożliwia użytkownikom ciągłe udostępnianie lokalizacji członkom grupy rodzinnej.
  • W aplikacji IoT funkcja umożliwia użytkownikom skonfigurowanie urządzeń domowych w taki sposób, aby wyłączały się, gdy użytkownik opuszcza dom, i włączały się ponownie, gdy wraca.

System uznaje, że aplikacja korzysta z lokalizacji w tle, jeśli uzyskuje dostęp do bieżącej lokalizacji urządzenia w innych sytuacjach niż opisane w sekcji Lokalizacja na pierwszym planie. Dokładność lokalizacji w tle jest taka sama jak dokładność lokalizacji na pierwszym planie, która zależy od uprawnień do lokalizacji zadeklarowanych przez aplikację.

Na Androidzie 10 (poziom API 29) i nowszych wersjach musisz zadeklarować uprawnienie ACCESS_BACKGROUND_LOCATION w manifeście aplikacji, aby w czasie działania aplikacji poprosić o dostęp do lokalizacji w tle. W starszych wersjach Androida, gdy aplikacja uzyskuje dostęp do lokalizacji na pierwszym planie, automatycznie uzyskuje też dostęp do lokalizacji w tle.

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

Dokładność

Android obsługuje te poziomy dokładności lokalizacji:

W przybliżeniu
Podaje przybliżoną lokalizację urządzenia. Jeśli szacowana lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, jest ona dokładna w zakresie około 3 kilometrów kwadratowych (około 1,2 mili kwadratowej). Aplikacja może otrzymywać lokalizacje z taką dokładnością, gdy zadeklarujesz uprawnienie ACCESS_COARSE_LOCATION, ale nie uprawnienie ACCESS_FINE_LOCATION.
Dokładnie
podaje możliwie najdokładniejszą szacunkową lokalizację urządzenia. Jeśli szacunkowa lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, zwykle jest ona dokładna w promieniu około 50 metrów, a czasami nawet kilku metrów. Aplikacja może otrzymywać lokalizacje z taką dokładnością, jeśli zadeklarujesz uprawnienie ACCESS_FINE_LOCATION.

Jeśli użytkownik przyzna aplikacji uprawnienia do przybliżonej lokalizacji, będzie ona mieć dostęp tylko do przybliżonej lokalizacji, niezależnie od tego, jakie uprawnienia do lokalizacji deklaruje.

Aplikacja powinna działać nawet wtedy, gdy użytkownik przyzna jej dostęp tylko do przybliżonej lokalizacji. Jeśli funkcja w Twojej aplikacji bezwzględnie wymaga dostępu do dokładnej lokalizacji za pomocą uprawnienia ACCESS_FINE_LOCATION, możesz poprosić użytkownika o zezwolenie na dostęp do dokładnej lokalizacji.

Przypomnienie o przyznaniu dostępu do lokalizacji w tle

Na urządzeniach z Androidem 10 (poziom interfejsu API 29) lub nowszym, gdy funkcja w aplikacji po raz pierwszy uzyskuje dostęp do lokalizacji urządzenia w tle po tym, jak użytkownik przyznał jej taki dostęp, system planuje wysłanie do użytkownika powiadomienia. To powiadomienie przypomina użytkownikowi, że zezwolił aplikacji na stały dostęp do lokalizacji urządzenia. Przykładowe powiadomienie widać na rysunku 8.

Sprawdź wymagania dotyczące lokalizacji w zależnościach pakietu SDK aplikacji

Sprawdź, czy Twoja aplikacja korzysta z pakietów SDK, które wymagają uprawnień do lokalizacji, w szczególności uprawnienia ACCESS_FINE_LOCATION. Więcej informacji znajdziesz w artykule na blogu Medium Poznaj zachowania zależności pakietu SDK.

Dodatkowe materiały

Więcej informacji o uprawnieniach do lokalizacji na Androidzie znajdziesz w tych materiałach:

Codelabs

Filmy

Próbki