Poproś o dostęp do lokalizacji

Na Androidzie jest wiele sposobów na wysyłanie próśb o informacje o lokalizacji użytkownika, a najlepsza metoda zależy od konkretnego przypadku użycia. W tym przewodniku opisujemy różne scenariusze dostępu do lokalizacji i wyjaśniamy, jak w każdym z nich poprosić o uprawnienia do lokalizacji.

Na początek zapoznaj się ze sprawdzonymi metodami dotyczącymi wszystkich uprawnień w czasie działania oraz ogólnymi wskazówkami dotyczącymi ograniczania liczby próśb o uprawnienia.

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 uruchamia usługę 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 jako 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>

Jednorazowy dostęp Oprócz dostępu do danych o lokalizacji na pierwszym planie w niektórych przypadkach użycia wystarczy dostęp do lokalizacji użytkownika w określonych momentach korzystania z aplikacji, a nie ciągłe aktualizowanie danych podczas używania aplikacji. W takich przypadkach aplikacje powinny używać przycisku lokalizacji, aby poprosić o dostęp do lokalizacji w ramach danej sesji korzystania z aplikacji. Dodatkowo, jeśli Twoja aplikacja jest kierowana na Androida 17 (poziom API 37) lub nowszego i zawiera tylko funkcje, które wymagają dostępu do lokalizacji w ramach sesji, zasady Google Play wymagają używania przycisku lokalizacji. Więcej informacji znajdziesz w zasadach dotyczących przycisku lokalizacji.

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 interfejsu API 29) i nowszym musisz zadeklarować uprawnienie ACCESS_BACKGROUND_LOCATION w pliku manifestu 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:

Przybliżona
Podaje szacunkową lokalizację urządzenia. Jeśli szacowana lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, jest ona dokładna w promieniu 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 zadeklarujesz uprawnienia ACCESS_FINE_LOCATION.
Precyzyjne
Podaje szacunkową lokalizację urządzenia, która jest jak najbardziej dokładna. 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 uprawnienia dostępu do przybliżonej lokalizacji, Twoja aplikacja będzie mieć dostęp tylko do przybliżonej lokalizacji, niezależnie od tego, jakie uprawnienia dostępu do lokalizacji zadeklaruje.

Aplikacja powinna nadal działać, gdy użytkownik przyzna jej dostęp tylko do przybliżonej lokalizacji. Jeśli funkcja w 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 powiadomienia do użytkownika. To powiadomienie przypomina użytkownikowi, że zezwolił Twojej aplikacji na stały dostęp do lokalizacji urządzenia. Przykładowe powiadomienie widać na rysunku 8.

Sprawdzanie wymagań dotyczących 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 poście 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

Przykłady