Poproś o dostęp do lokalizacji

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

Dostęp do lokalizacji wymaga wielu uprawnień. Wymagania dotyczące lokalizacji w przypadku aplikacji zależą od jej przypadku użycia.

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

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

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 otrzymuje informacje o lokalizacji tylko raz lub przez określony czas, funkcja ta wymaga dostępu do lokalizacji na pierwszym planie. Oto kilka przykładów:

  • Funkcja w aplikacji do nawigacji, która umożliwia użytkownikom otrzymywanie 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 używa lokalizacji na pierwszym planie, jeśli jej funkcja uzyskuje dostęp do bieżącej lokalizacji urządzenia w jednym z tych przypadków:

  • 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 jest uruchomiona w tle, np. gdy użytkownik naciśnie przycisk Główny na urządzeniu lub wyłączy jego wyświetlacz.

    Dodatkowo musisz zadeklarować typ usługi na pierwszym planielocation, jak pokazano w tym fragmencie kodu. Na Androidzie 10 (poziom interfejsu API 29) lub nowszym 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 uprawnienia 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 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 użytkownicy mogą stale udostępniać swoją lokalizację członkom grupy.
  • W aplikacji IoT funkcja umożliwia użytkownikom konfigurowanie urządzeń domowych w taki sposób, aby wyłączały się, gdy użytkownik wyjdzie z domu, i znów włączyły, gdy wróci do domu.

System uznaje, że aplikacja korzysta z lokalizacji w tle, jeśli uzyskuje dostęp do bieżącej lokalizacji urządzenia w sytuacji innej niż opisana 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 deklarowanych przez aplikację uprawnień dostępu do lokalizacji.

W przypadku Androida 10 (poziom interfejsu API 29) i wyższych musisz zadeklarować uprawnienie ACCESS_BACKGROUND_LOCATION w pliku manifestu aplikacji, aby poprosić o dostęp do lokalizacji w tle w czasie działania. W starszych wersjach Androida, gdy aplikacja uzyska dostęp do lokalizacji na pierwszym planie, automatycznie uzyska 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 ta lokalizacja została oszacowana na podstawie danych z LocationManagerService lub FusedLocationProvider, jest ona dokładna do około 3 kilometrów kwadratowych (około 1,2 mil kwadratowych). Aplikacja może otrzymywać lokalizacje o tym poziomie dokładności, jeśli zadeklarujesz uprawnienie ACCESS_COARSE_LOCATION, ale nie ACCESS_FINE_LOCATION.
Dokładnie
Pozwala na jak najbardziej dokładne oszacowanie lokalizacji urządzenia. Jeśli szacowana lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, jest zwykle określana z dokładnością do około 50 metrów (160 stóp), a czasem nawet z dokładnością do kilku metrów. Gdy zadeklarujesz uprawnienie ACCESS_FINE_LOCATION, aplikacja może otrzymywać lokalizacje o tym poziomie dokładności.

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

Aplikacja powinna działać, gdy użytkownik przyzna dostęp do przybliżonej lokalizacji. Jeśli funkcja w aplikacji wymaga dostępu do dokładnej lokalizacji za pomocą uprawnienia ACCESS_FINE_LOCATION, możesz poprosić użytkownika, aby zezwolił 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, gdy funkcja w aplikacji po raz pierwszy uzyskuje dostęp do lokalizacji urządzenia w tle po tym, jak użytkownik zezwolił na 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. Rysunek 8 przedstawia przykładowe powiadomienie.

Sprawdź wymagania dotyczące lokalizacji w zależnych pakietach SDK aplikacji

Sprawdź, czy Twoja aplikacja korzysta z pakietów SDK, które wymagają dostępu do lokalizacji, w szczególności uprawnienia ACCESS_FINE_LOCATION. Aby dowiedzieć się więcej, przeczytaj na Medium post Poznaj działanie zależności pakietu SDK.

Dodatkowe materiały

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

Ćwiczenia z programowania

Filmy

Próbki