Poproś o dostęp do lokalizacji

W Androidzie jest kilka sposobów na uzyskanie informacji o lokalizacji użytkownika, a najlepszy z nich zależy od 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ń przyznawanych w czasie działania aplikacji oraz z 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 Twoja aplikacja zawiera funkcję, która udostępnia lub odbiera informacje o lokalizacji tylko raz lub przez określony czas, ta funkcja wymaga dostępu do lokalizacji na pierwszym planie. Oto kilka przykładów:

  • W aplikacji do nawigacji funkcja umożliwia użytkownikom uzyskiwanie wskazówek dojazdu krok po kroku.
  • W aplikacji do przesyłania wiadomości funkcja umożliwia użytkownikom udostępnianie swojej bieżącej lokalizacji innym użytkownikom.

System uznaje, że Twoja 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.
  • Twoja 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. Twoja aplikacja zachowuje dostęp, gdy jest umieszczona w tle, np. gdy użytkownik naciśnie przycisk Strona główna 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 Androidzie 10 (poziom interfejsu API 29) i nowszych wersjach 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 Twoja 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 niektóre przypadki użycia wymagają dostępu do lokalizacji użytkownika tylko w określonych momentach korzystania z aplikacji, a nie ciągłego aktualizowania lokalizacji podczas korzystania z aplikacji. W takich przypadkach aplikacje powinny używać przycisku lokalizacji, aby poprosić o dostęp do lokalizacji na czas danej sesji korzystania z aplikacji. Jeśli Twoja aplikacja jest kierowana na Androida 17 (poziom interfejsu API 37) lub nowszego i zawiera tylko funkcje, które wymagają dostępu do lokalizacji na czas sesji, zasady Google Play wymagają użycia 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 aplikacji stale udostępnia lokalizację innym użytkownikom lub korzysta z interfejsu Geofencing API. Oto kilka przykładów:

  • W aplikacji do udostępniania lokalizacji rodzinie funkcja umożliwia użytkownikom ciągłe udostępnianie lokalizacji członkom rodziny.
  • W aplikacji IoT funkcja umożliwia użytkownikom konfigurowanie urządzeń domowych tak, aby wyłączały się, gdy użytkownik opuszcza dom, i włączały się, gdy wraca.

System uznaje, że Twoja aplikacja korzysta z lokalizacji w tle, jeśli uzyskuje dostęp do bieżącej lokalizacji urządzenia w dowolnej sytuacji innej 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 Twoją aplikację.

W Androidzie 10 (poziom interfejsu API 29) i nowszych wersjach, aby poprosić o dostęp do lokalizacji w tle w czasie działania aplikacji, musisz zadeklarować w pliku manifestu aplikacji uprawnienie ACCESS_BACKGROUND_LOCATION. W starszych wersjach Androida, gdy Twoja 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 ta szacunkowa lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, jest dokładna z dokładnością do około 3 kilometrów kwadratowych. Twoja aplikacja może otrzymywać lokalizacje z tym poziomem dokładności, gdy zadeklarujesz uprawnienie ACCESS_COARSE_LOCATION, ale nie uprawnienie ACCESS_FINE_LOCATION.
Precyzyjne
Podaje szacunkową lokalizację urządzenia, która jest tak dokładna, jak to możliwe. Jeśli szacunkowa lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, jest zwykle dokładna z dokładnością do około 50 metrów, a czasami nawet do kilku metrów. Twoja aplikacja może otrzymywać lokalizacje z tym poziomem dokładności, gdy zadeklarujesz uprawnienie ACCESS_FINE_LOCATION.

Jeśli użytkownik przyzna uprawnienie do przybliżonej lokalizacji, Twoja aplikacja będzie mieć dostęp tylko do przybliżonej lokalizacji, niezależnie od tego, jakie uprawnienia do lokalizacji zadeklaruje.

Twoja aplikacja powinna nadal działać, 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 aplikacji na dostęp do dokładnej lokalizacji.

Przypomnienie o przyznaniu dostępu do lokalizacji w tle

W Androidzie 10 (poziom interfejsu API 29) i nowszych wersjach, gdy funkcja w Twojej aplikacji po raz pierwszy uzyskuje dostęp do lokalizacji urządzenia w tle po tym, jak użytkownik przyznał dostęp do lokalizacji w tle, system planuje wysłanie do użytkownika powiadomienia. To powiadomienie przypomina użytkownikowi, że zezwolił Twojej aplikacji na stały dostęp do lokalizacji urządzenia. Przykładowe powiadomienie jest widoczne na ilustracji 8.

Sprawdzanie wymagań dotyczących lokalizacji w zależnościach pakietu SDK aplikacji

Sprawdź, czy Twoja aplikacja korzysta z pakietów SDK, które zależą od uprawnień do lokalizacji, zwłaszcza od uprawnienia ACCESS_FINE_LOCATION. Więcej informacji znajdziesz w poście na Medium Getting to know the behaviors of your SDK dependencies (Poznaj zachowania zależności pakietu SDK) for more.

Dodatkowe materiały

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

Codelabs

Filmy

Przykłady