Poproś o dostęp do lokalizacji

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

Gdy prosisz o dostęp do lokalizacji, postępuj zgodnie z tymi samymi sprawdzonymi metodami jak w przypadku innych uprawnień środowiska wykonawczego. Ważna różnica w dostępie do lokalizacji jest taka, system oferuje wiele pozwoleń związanych z lokalizacją. Które uprawnienia i to, jak o nie poprosisz, zależą od wymagań dotyczących lokalizacji do konkretnego przypadku użycia.

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

Rodzaje dostępu do lokalizacji

Każde uprawnienie ma następujące cechy:

Lokalizacja na pierwszym planie

Jeśli aplikacja zawiera funkcję, która udostępnia lub otrzymuje tylko informacje o lokalizacji raz lub przez określony czas, obiekt wymaga pierwszego planu dostęp do lokalizacji. Oto kilka przykładów:

  • Funkcja w aplikacji do nawigacji zapewnia użytkownikom szczegółowe wskazówek dojazdu.
  • Funkcja w aplikacji do obsługi wiadomości umożliwia użytkownikom udostępnianie swojej bieżącej lokalizacji z innym użytkownikiem.

System uznaje aplikację za używaną lokalizację na pierwszym planie, jeśli funkcja aplikacja uzyskuje dostęp do bieżącej lokalizacji urządzenia w jednym z tych miejsc w sytuacjach:

  • Widoczna jest aktywność należąca do Twojej aplikacji.
  • Twoja aplikacja działa na pierwszym planie. Gdy usługa na pierwszym planie jest system zwiększa świadomość użytkowników, wyświetlając trwałe powiadomienie. Aplikacja zachowuje dostęp, gdy jest uruchomiona w tle, np. użytkownik naciska przycisk ekranu głównego na urządzeniu lub obraca ekran wyłączone.

    Zalecamy również zadeklarowanie usługi działających na pierwszym planie typ location zgodnie z tym fragmentem kodu. Na Androidzie 10 (interfejs API) poziomu 29) lub wyższym, 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 wysyła żądanie ACCESS_COARSE_LOCATION lub ACCESS_FINE_LOCATION zgodnie z tym fragmentem:

<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 jakaś jej funkcja stale udostępnia swoją lokalizację innym użytkownikom lub korzysta z funkcji geofencingu API. Oto kilka przykładów:

  • Funkcja w aplikacji do udostępniania lokalizacji w grupie rodzinnej pozwala użytkownikom udostępniać lokalizację członkom rodziny.
  • Funkcja w aplikacji IoT umożliwia użytkownikom konfigurowanie urządzeń domowych, takich jak które wyłączają się, gdy użytkownik wychodzi z domu, i włączają ponownie, gdy użytkownik wraca do strony głównej.

System uznaje, że aplikacja używa lokalizacji w tle, jeśli uzyskuje dostęp do bieżącej lokalizacji urządzenia poza sytuacjami opisanymi w lokalizacji na pierwszym planie. Dokładność lokalizacji w tle wynosi taką samą jak dokładność lokalizacji na pierwszym planie, która zależy od uprawnienia dostępu do lokalizacji deklarowane przez aplikację.

W Androidzie 10 (poziom interfejsu API 29) i nowszych musisz zadeklarować ACCESS_BACKGROUND_LOCATION uprawnienia w pliku manifestu aplikacji, aby poprosić o dostęp do lokalizacji w tle dostępu podczas działania. We wcześniejszych wersjach Gdy aplikacja uzyska dostęp do lokalizacji na pierwszym planie, automatycznie również aplikacja uzyskuje 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 następujące poziomy dokładności lokalizacji:

W przybliżeniu
Udostępnia przybliżoną lokalizację urządzenia. Jeśli ta orientacyjna lokalizacja pochodzi z LocationManagerService lub FusedLocationProvider, to szacunki z dokładnością do około 3 kilometrów kwadratowych (około 1,2 mil). Aplikacja może otrzymywać lokalizacje z taką dokładnością, jeśli: zadeklarować uprawnienie ACCESS_COARSE_LOCATION, ale nie ACCESS_FINE_LOCATION.
Dokładnie
Udostępnia najdokładniejszą orientacyjną lokalizację urządzenia. Jeśli szacowana lokalizacja jest z LocationManagerService lub FusedLocationProvider, to oszacowanie zazwyczaj mieści się w promieniu ok. 50 metrów, a czasami jest z dokładnością do co najmniej kilku metrów. Aplikacja może otrzymywać te dane lokalizacji z taką dokładnością, gdy zadeklarujesz ACCESS_FINE_LOCATION uprawnienia.

Jeśli użytkownik przyzna dostęp do przybliżonej lokalizacji, aplikacja ma dostęp tylko do przybliżonej lokalizacji, niezależnie od tego, uprawnienia deklarowane przez aplikację.

Aplikacja powinna nadal działać, gdy użytkownik przyzna tylko przybliżoną lokalizację dostęp. Jeśli funkcja aplikacji absolutnie wymaga dostępu do dokładnej lokalizacji za pomocą uprawnień ACCESS_FINE_LOCATION, możesz poprosić użytkownika o pozwolenie na aplikacji, aby uzyskać dostęp do dokładnej lokalizacji.

Wysyłanie prośby o dostęp do lokalizacji podczas działania

Gdy funkcja w aplikacji wymaga dostępu do lokalizacji, poczekaj, aż użytkownik wejdzie w interakcję z daną funkcją przed wysłaniem prośby o uprawnienia. Ten przepływ pracy jest zgodny z sprawdzoną metodę proszenia o przyznanie uprawnień czasu działania w kontekście, jak opisano w Przewodnik wyjaśniający, jak poprosić o aplikację .

Ilustracja 1 pokazuje, jak to zrobić. Aplikacja zawiera „udostępnij lokalizację” funkcja, która wymaga dostępu do lokalizacji na pierwszym planie. Aplikacja nie prosi o dostęp do lokalizacji, dopóki użytkownik nie wybierze Przycisk udostępniania lokalizacji.

Gdy użytkownik wybierze przycisk Udostępnij lokalizację,
    pojawi się okno dialogowe przyznawania dostępu do lokalizacji systemu
Rysunek 1. Funkcja udostępniania lokalizacji, która wymaga dostępu do lokalizacji na pierwszym planie. Funkcja zostanie włączona, jeśli użytkownik wybierze opcję Zezwalaj tylko podczas używania aplikacji.

Użytkownik może przyznawać tylko przybliżoną lokalizację

Na Androidzie 12 (poziom interfejsu API 31) lub nowszym użytkownicy mogą poprosić o pobranie aplikacji. informacje o przybliżonej lokalizacji, nawet jeśli aplikacja poprosi o ACCESS_FINE_LOCATION uprawnień w czasie działania.

Aby uwzględnić to potencjalne zachowanie użytkownika, nie wysyłaj żądania ACCESS_FINE_LOCATION lub zgodę na wykorzystanie danych. Zamiast tego poproś o ACCESS_FINE_LOCATION uprawnienia i ACCESS_COARSE_LOCATION. w jednym żądaniu środowiska wykonawczego. Jeśli spróbujesz wysłać prośbę tylko o ACCESS_FINE_LOCATION, system ignoruje żądanie w niektórych wersjach Android 12. Jeśli Twoja aplikacja jest kierowana na Androida 12 lub wyżej, system zarejestruje następujący komunikat o błędzie w Logcat:

ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

Gdy aplikacja poprosi zarówno ACCESS_FINE_LOCATION, jak i ACCESS_COARSE_LOCATION, okno uprawnień systemowych zawiera te opcje:

  • Dokładna: umożliwia aplikacji uzyskiwanie dokładnych informacji o lokalizacji.
  • Przybliżona: umożliwia aplikacji pobieranie tylko informacji o przybliżonej lokalizacji.

Rysunek 3 pokazuje, że okno zawiera dla obu opcji, aby pomóc użytkownikowi dokonać wyboru. Gdy użytkownik wybierze dokładności lokalizacji, klikają jeden z 3 przycisków, aby wybrać przyznanych uprawnień.

Na urządzeniach z Androidem 12 i nowszym użytkownicy mogą otwierać ustawienia systemu. ustaw preferowaną dokładność lokalizacji dla dowolnej aplikacji, niezależnie od tego, docelową wersję pakietu SDK. Dzieje się tak nawet wtedy, gdy aplikacja jest zainstalowana na urządzeniu. z Androidem 11 lub starszym, a następnie użytkownik uaktualnia na urządzeniu z Androidem 12 lub nowszym.

Okno dialogowe odnosi się tylko do przybliżonej lokalizacji
         zawiera 3 przyciski, jeden nad drugim
Rysunek 2. Okno uprawnień systemowych wyświetlane, gdy aplikacja prosi tylko o ACCESS_COARSE_LOCATION.
Okno zawiera 2 zestawy opcji, jeden nad drugim
Rysunek 3. Okno uprawnień systemowych wyświetlane, gdy aplikacja żąda zarówno ACCESS_FINE_LOCATION, jak i ACCESS_COARSE_LOCATION w jednym żądaniu środowiska wykonawczego.

Wybór użytkownika wpływa na przyznawanie uprawnień

W tabeli poniżej znajdziesz uprawnienia przyznawane aplikacji przez system. na podstawie opcji wybranych przez użytkownika w oknie dialogowym uprawnień w czasie działania:

Dokładnie W przybliżeniu
Podczas używania aplikacji ACCESS_FINE_LOCATION i
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
Tylko tym razem ACCESS_FINE_LOCATION i
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
Odmów Brak dostępu do lokalizacji Brak dostępu do lokalizacji

Aby określić, które uprawnienia aplikacji przyznał system, sprawdź wartość żądania o uprawnienia. W kodzie możesz używać bibliotek Jetpack Możesz w ten sposób użyć bibliotek platformy, zarządzanie kodem prośby o uprawnienia .

Kotlin

val locationPermissionRequest = registerForActivityResult(
        ActivityResultContracts.RequestMultiplePermissions()
    ) { permissions ->
        when {
            permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> {
                // Precise location access granted.
            }
            permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> {
                // Only approximate location access granted.
            } else -> {
                // No location access granted.
            }
        }
    }

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION))

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean coarseLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_COARSE_LOCATION,false);
            if (fineLocationGranted != null && fineLocationGranted) {
                // Precise location access granted.
            } else if (coarseLocationGranted != null && coarseLocationGranted) {
                // Only approximate location access granted.
            } else {
                // No location access granted.
            }
        }
    );

// ...

// Before you perform the actual permission request, check whether your app
// already has the permissions, and whether your app needs to show a permission
// rationale dialog. For more details, see Request permissions.
locationPermissionRequest.launch(new String[] {
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION
});

Poproś o podniesienie dokładnej lokalizacji

Możesz poprosić użytkownika o zmianę uprawnień dostępu aplikacji z przybliżonej lokalizacji na dokładną lokalizację. Zanim poprosisz użytkownika o zmianę uprawnień dostępu aplikacji do dokładna lokalizacja. Zastanów się jednak, czy rzeczywiście wymaga tak precyzyjnej dokładności. Jeśli aplikacja musi sparować urządzenie z urządzeniami w pobliżu urządzeń przez Bluetooth lub Wi-Fi, rozważ zastosowanie urządzenia towarzyszącego parowanie lub Bluetooth , a nie prosi o uprawnienie ACCESS_FINE_LOCATION.

Aby poprosić użytkownika o zmianę uprawnień dostępu aplikacji do lokalizacji z przybliżonej na wykonaj te czynności:

  1. Jeśli to konieczne, wyjaśnij, dlaczego aplikacja wymaga .
  2. Poproś o uprawnienia ACCESS_FINE_LOCATION i ACCESS_COARSE_LOCATION z powrotem. Ponieważ użytkownik zezwolił już systemowi na przyznawanie dostępu przybliżone położenie Twojej aplikacji, okno dialogowe systemu jest tym razem inne, ponieważ na rysunku 4 oraz rys. 5:
Okno zawiera opcje „Zmień na dokładną”
         „location” (lokalizacja), „Only this time” (Tylko tym razem) i „Odmów”.
Rysunek 4. Poprzedni użytkownik zaznaczono opcje Przybliżone i Podczas używania aplikacji (w oknie na ilustracji 3).
Okno zawiera opcje „Tylko tym razem”. oraz
         &#39;Deny&#39;.
Rysunek 5. Poprzedni użytkownik wybrano Przybliżone i Tylko tym razem (w oknie dialogowym od ilustrację 3).

Początkowo żądaj tylko lokalizacji na pierwszym planie

Nawet jeśli kilka funkcji aplikacji wymaga dostępu do lokalizacji, tylko niektóre wymagają dostępu do lokalizacji w tle. Dlatego zaleca wysyłanie przez aplikację żądań przyrostowych dotyczących lokalizacji. dostępu z prośbą o dostęp do lokalizacji na pierwszym planie, a następnie o dostęp do lokalizacji w tle dostęp. Wykonując żądania przyrostowe, dajesz użytkownikom większą kontrolę przejrzystości, ponieważ mogą lepiej zrozumieć, które funkcje aplikacji dostęp do lokalizacji w tle.

Rysunek 6 przedstawia przykład aplikacji zaprojektowanej do obsługi przyrostowej żądań. Zarówno opcja „Pokaż bieżącą lokalizację”, i „poleć miejsca w pobliżu” funkcje wymagają dostępu do lokalizacji na pierwszym planie. Tylko „Poleć miejsca w pobliżu” wymaga jednak dostępu do lokalizacji w tle.

Przycisk włączający dostęp do lokalizacji na pierwszym planie to
    znajduje się na połowie ekranu od przycisku, który włącza tło
    lokalizacja
Rysunek 6. Obie funkcje wymagają dostępu do lokalizacji, ale tylko „Poleć funkcje w pobliżu” funkcja wymaga dostępu do lokalizacji w tle

Proces wykonywania żądań przyrostowych wygląda tak:

  1. Na początku aplikacja powinna prowadzić użytkowników do funkcji, które wymagają dostęp do lokalizacji na pierwszym planie, np. „udostępnij lokalizację” cecha na rys. 1 lub „Pokaż bieżącą lokalizację” na rys. 2.

    Zalecamy wyłączenie dostępu użytkowników do funkcji, które wymagają dostęp do lokalizacji w tle do momentu, aż aplikacja uzyska lokalizację na pierwszym planie dostęp.

  2. Później, gdy użytkownik zapozna się z funkcjami, które wymagają dostęp do lokalizacji w tle, możesz żądanie lokalizacji w tle dostęp.

W razie potrzeby poproś o dostęp do lokalizacji w tle

Rysunek 7. Strona ustawień zawiera opcję Zawsze zezwalaj, która określa lokalizację w tle. dostęp.

Zawartość okna uprawnień zależy od docelowej wersji pakietu SDK

Gdy funkcja aplikacji prosi o dostęp do lokalizacji w tle na urządzeniu, które działa Android 10 (poziom interfejsu API 29) w oknie uprawnień systemu znajduje się opcja o nazwie Zawsze zezwalaj. Jeśli użytkownik wybierze tę opcję, funkcja w aplikacja uzyskuje dostęp do lokalizacji w tle.

Na Androidzie 11 (poziom interfejsu API 30) i nowszych wersjach okno dialogowe nie dodaj opcję Zawsze zezwalaj. Zamiast tego użytkownicy muszą włączyć działanie w tle lokalizację na stronie ustawień, jak widać na rysunku 7.

Możesz ułatwić użytkownikom przejście na tę stronę ustawień, stosując sprawdzone metody gdy prosisz o dostęp do lokalizacji w tle. Proces przyznawania zależy od docelowej wersji pakietu SDK aplikacji.

Aplikacja jest kierowana na Androida 11 lub nowszego

Jeśli Twoja aplikacja nie otrzymała uprawnienia ACCESS_BACKGROUND_LOCATION, shouldShowRequestPermissionRationale(). zwraca true, wyświetla użytkownikom interfejs edukacyjny zawierający:

  • jasne wyjaśnienie, dlaczego funkcja Twojej aplikacji wymaga dostępu w tle; lokalizacji.
  • Widoczna dla użytkownika etykieta opcji ustawień, która umożliwia dostęp do lokalizacji w tle. (na przykład Zawsze zezwalaj na ilustracji 7). Możesz zadzwonić do nas, getBackgroundPermissionOptionLabel() aby otrzymać tę etykietę. Wartość zwrotna tej metody jest zlokalizowana na ustawienia języka na urządzeniu.
  • opcja odmowy uprawnień przez użytkowników; Jeśli użytkownicy odrzucili tło dostępu do lokalizacji, powinien mieć możliwość dalszego korzystania z aplikacji.
Użytkownicy mogą kliknąć powiadomienie systemowe, aby zmienić lokalizację
  ustawienia aplikacji
Rysunek 8. Powiadomienie przypominające użytkownikowi o przyznaniu uprawnień dostęp aplikacji do lokalizacji w tle.
.

Aplikacja jest kierowana na Androida 10 lub starszego

Gdy funkcja aplikacji poprosi o dostęp do lokalizacji w tle, użytkownicy zobaczą okno systemu. To okno zawiera opcję przejścia do lokalizacji aplikacji uprawnień na stronie ustawień.

O ile Twoja aplikacja jest już zgodna ze sprawdzonymi metodami przesyłania próśb o lokalizację uprawnień, nie musisz jednak wprowadzać żadnych zmian, aby umożliwić takie działanie.

Użytkownik może wpływać na dokładność lokalizacji w tle

Jeśli użytkownik prosi o przybliżoną lokalizację, dane opcje w oknie dostępu do lokalizacji mają też zastosowanie do lokalizacji w tle. W Innymi słowy, jeśli użytkownik przyzna aplikacji ACCESS_BACKGROUND_LOCATION dostępu, ale zezwala jedynie na dostęp do przybliżonej lokalizacji na pierwszym planie, aplikacja ma również dostęp do przybliżonej lokalizacji w tle.

Przypomnienie o przyznaniu lokalizacji w tle

Na Androidzie 10 i nowszych, gdy funkcja aplikacji uzyskuje dostęp do lokalizacji urządzenia w Działanie w tle po raz pierwszy od momentu przyznania przez użytkownika lokalizacji w tle system planuje wysłanie powiadomienia do użytkownika. Ten informuje użytkownika, że zezwolił aplikacji na dostęp do urządzenia lokalizację przez cały czas. Przykładowe powiadomienie wyświetla się na rys. 8.

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

Sprawdź, czy aplikacja korzysta z pakietów SDK, które korzystają z dostępu do lokalizacji. zwłaszcza uprawnienie ACCESS_FINE_LOCATION. Zapoznaj się z tym artykułem w Medium o sposobie działania pakietu SDK .

Dodatkowe materiały

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

Ćwiczenia z programowania

Filmy

Próbki