Poproś o dostęp do lokalizacji

Istnieje kilka sposobów na poproszenie o informacje o lokalizacji użytkownika na Androidzie, a najlepsza ścieżka zależy od przypadku użycia. W tym przewodniku opisujemy różne scenariusze dostępu do lokalizacji i wyjaśniamy, jak w każdym przypadku poprosić o dostęp do lokalizacji.

Na początek zapoznaj się ze sprawdzonymi metodami dotyczącymi wszystkich uprawnień w czasie działania aplikacji oraz z ogólnymi wskazówkami na temat ograniczania 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 lub przez określony czas, funkcja ta wymaga dostępu do lokalizacji na pierwszym planie. Oto niektóre przykłady:

  • W aplikacji do nawigacji funkcja umożliwia użytkownikom uzyskiwanie szczegółowych wskazówek dojazdu.
  • W aplikacji do obsługi wiadomości dostępna jest funkcja, która umożliwia użytkownikom udostępnianie swojej bieżącej lokalizacji innym użytkownikom.

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

  • Aktywność należąca do Twojej aplikacji jest widoczna.
  • Aplikacja uruchamia usługę na pierwszym planie. Gdy usługa na pierwszym planie jest uruchomiona, system informuje o tym użytkownika, wyświetlając stałe powiadomienie. Aplikacja zachowuje dostęp, gdy działa w tle, np. gdy użytkownik naciśnie przycisk ekranu głównego na urządzeniu lub wyłączy wyświetlacz.

    Dodatkowo zadeklaruj typ usługi na pierwszym planie jako location, jak pokazano w tym fragmencie kodu. Na Androidzie 10 (poziom interfejsu API 29) i nowszych 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>
    

Deklarujesz potrzebę dostępu do lokalizacji na pierwszym planie, 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>

Dostęp jednorazowy Oprócz dostępu do danych o lokalizacji na pierwszym planie w niektórych przypadkach użycia występuje dodatkowe rozróżnienie, które polega na tym, że dostęp do lokalizacji użytkownika jest potrzebny tylko w określonych momentach korzystania z aplikacji, a nie przez cały czas. W takich przypadkach aplikacje powinny używać przycisku lokalizacji, aby poprosić o dostęp do lokalizacji na czas danej sesji korzystania z aplikacji. Dodatkowo, 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 podstawie sesji, wymagania wynikające z zasad 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 jej funkcja 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 dostępna jest funkcja, która pozwala użytkownikom skonfigurować urządzenia domowe tak, aby wyłączały się, gdy użytkownik wychodzi z domu, i włączały się, gdy wraca.

System uznaje, że aplikacja używa lokalizacji w tle, jeśli uzyskuje ona dostęp do bieżącej lokalizacji urządzenia w sytuacjach innych 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ń dostępu do lokalizacji zadeklarowanych przez aplikację.

Na Androidzie 10 (API na poziomie 29) i nowszych wersjach musisz zadeklarować uprawnienie ACCESS_BACKGROUND_LOCATION w pliku manifestu aplikacji, aby poprosić o dostęp do lokalizacji w tle w czasie działania. We wcześniejszych 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. 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 możliwie najdokładniejsza. Jeśli szacunkowa lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, jest zwykle dokładna do około 50 metrów, a czasem nawet do kilku metrów. Aplikacja może otrzymywać lokalizacje z tym poziomem dokładności, gdy zadeklarujesz uprawnienie ACCESS_FINE_LOCATION.

Jeśli użytkownik przyzna dostęp do przybliżonej lokalizacji, aplikacja będzie miała dostęp tylko do przybliżonej lokalizacji, niezależnie od tego, jakie uprawnienia dostępu do lokalizacji zadeklaruje.

Aplikacja powinna działać, nawet jeśli 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 aplikacji na dostęp do dokładnej lokalizacji.

Przypomnienie o przyznaniu dostępu do lokalizacji w tle

Na Androidzie 10 (poziom API 29) i nowszych, gdy funkcja w 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 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 jest widoczne na rysunku 8.

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

Sprawdź, czy Twoja aplikacja używa pakietów SDK, które wymagają dostępu do lokalizacji, zwłaszcza uprawnienia ACCESS_FINE_LOCATION. Więcej informacji znajdziesz w poście na blogu Getting to know the behaviors of your SDK dependencies (Poznaj zachowania zależności pakietu SDK) na Medium.

Dodatkowe materiały

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

Codelabs

Filmy

Przykłady