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

Zanim poprosisz o dostęp do lokalizacji w czasie działania aplikacji, zapoznaj się z opcjami i sprawdzonymi metodami dotyczącymi dostępu do lokalizacji oraz z przewodnikiem na temat minimalizowania próśb o uprawnienia. Te materiały pomogą Ci zdecydować, o jakie uprawnienia poprosić i czy w Twoim przypadku lepszym rozwiązaniem nie będzie przycisk lokalizacji.

Wskazówki dotyczące dostępu do lokalizacji

Kilka ogólnych zasad, których należy przestrzegać przy podejmowaniu decyzji o sposobie wdrażania dostępu do lokalizacji w aplikacji.

Dostęp do lokalizacji w kontekście

Jeśli funkcja w aplikacji wymaga dostępu do lokalizacji, musisz poczekać, aż użytkownik wejdzie z nią w interakcję, zanim poprosisz o uprawnienia. Jest to zgodne ze sprawdzoną metodą proszenia o uprawnienia w czasie działania aplikacji w kontekście, opisaną w przewodniku wyjaśniającym, jak prosić o uprawnienia aplikacji.

Rysunek 1 pokazuje, jak przeprowadzić ten proces. Aplikacja zawiera funkcję „udostępnij lokalizację”, która wymaga dostępu do lokalizacji na pierwszym planie. Aplikacja nie prosi jednak o dostęp do lokalizacji, dopóki użytkownik nie kliknie przycisku Udostępnij lokalizację.

Gdy użytkownik kliknie przycisk Udostępnij lokalizację, pojawi się okno z prośbą o zgodę na dostęp do lokalizacji.
Rysunek 1. Funkcja udostępniania lokalizacji, która wymaga dostępu do lokalizacji na pierwszym planie. Funkcja jest włączona, jeśli użytkownik wybierze opcję Zezwalaj tylko podczas używania aplikacji.

Użytkownik może przyznać dostęp tylko do przybliżonej lokalizacji

Na Androidzie 12 (poziom interfejsu API 31) lub nowszym użytkownicy mogą zażądać, aby aplikacja pobierała tylko informacje o przybliżonej lokalizacji, nawet jeśli prosi ona o uprawnienie ACCESS_FINE_LOCATION w czasie działania.

Aby obsłużyć to potencjalne zachowanie użytkownika, nie proś o uprawnienie ACCESS_FINE_LOCATION samodzielnie. Zamiast tego w jednym żądaniu w czasie działania poproś zarówno o uprawnienie ACCESS_FINE_LOCATION, jak i ACCESS_COARSE_LOCATION. Jeśli spróbujesz poprosić tylko o ACCESS_FINE_LOCATION, system zignoruje prośbę w niektórych wersjach Androida 12. Jeśli aplikacja jest kierowana na Androida 12 lub nowszego, system rejestruje w Logcat ten komunikat o błędzie:

ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.

Gdy aplikacja prosi o uprawnienia ACCESS_FINE_LOCATION i ACCESS_COARSE_LOCATION, okno uprawnień systemowych zawiera te opcje dla użytkownika:

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

Rysunek 3 pokazuje, że okno zawiera wskazówkę wizualną dla obu opcji, która pomaga użytkownikowi dokonać wyboru. Po wybraniu dokładności lokalizacji użytkownik klika jeden z 3 przycisków, aby wybrać czas, na jaki przyznaje uprawnienia.

W Androidzie 12 i nowszych użytkownicy mogą przejść do ustawień systemowych, aby ustawić preferowaną dokładność lokalizacji dla dowolnej aplikacji, niezależnie od docelowej wersji pakietu SDK tej aplikacji. Dotyczy to nawet sytuacji, gdy aplikacja jest zainstalowana na urządzeniu z Androidem 11 lub starszym, a użytkownik uaktualni system do Androida 12 lub nowszego.

Okno dotyczy tylko przybliżonej lokalizacji i zawiera 3 przyciski, jeden nad drugim
Rysunek 2. Okno uprawnień systemowych, które pojawia się, gdy aplikacja prosi tylko o ACCESS_COARSE_LOCATION.
Okno zawiera 2 zestawy opcji, jeden nad drugim.
Rysunek 3. Okno uprawnień systemowych, które pojawia się, gdy aplikacja prosi zarówno o uprawnienie ACCESS_FINE_LOCATION, jak i ACCESS_COARSE_LOCATION w jednym żądaniu w czasie działania.

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

W tabeli poniżej znajdziesz uprawnienia, które system przyznaje aplikacji na podstawie opcji wybranych przez użytkownika w oknie uprawnień w czasie działania:

Precyzyjne Przybliżona
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
Odrzuć Brak dostępu do lokalizacji Brak dostępu do lokalizacji

Aby dowiedzieć się, które uprawnienia system przyznał Twojej aplikacji, sprawdź wartość zwracaną przez prośbę o uprawnienia. Możesz używać bibliotek Jetpack w kodzie podobnym do tego poniżej lub bibliotek platformy, w których samodzielnie zarządzasz kodem prośby o uprawnienia.

Kotlin

@RequiresApi(Build.VERSION_CODES.N)
fun requestPermissions() {
    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:
    // https://developer.android.com/training/permissions/requesting#request-permission
    locationPermissionRequest.launch(
        arrayOf(
            Manifest.permission.ACCESS_FINE_LOCATION,
            Manifest.permission.ACCESS_COARSE_LOCATION
        )
    )
}

Java

private void requestPermissions() {

    ActivityResultLauncher<String[]> locationPermissionRequest =
            registerForActivityResult(new ActivityResultContracts
                            .RequestMultiplePermissions(), result -> {

                Boolean fineLocationGranted = null;
                Boolean coarseLocationGranted = null;

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    fineLocationGranted = result.getOrDefault(
                            Manifest.permission.ACCESS_FINE_LOCATION, false);
                    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
    });
}

Prośba o przejście na dokładną lokalizację

Możesz poprosić użytkownika o zwiększenie uprawnień dostępu aplikacji z przybliżonej lokalizacji do dokładnej lokalizacji. Zanim jednak poprosisz użytkownika o przyznanie aplikacji dostępu do dokładnej lokalizacji, zastanów się, czy przypadek użycia aplikacji bezwzględnie wymaga takiego poziomu dokładności. Jeśli aplikacja musi sparować urządzenie z urządzeniami w pobliżu przez Bluetooth lub Wi-Fi, zamiast prosić o uprawnienie ACCESS_FINE_LOCATION, rozważ użycie parowania urządzeń towarzyszących lub uprawnień Bluetooth.

Aby poprosić użytkownika o zmianę dostępu aplikacji do lokalizacji z przybliżonej na dokładną:

  1. W razie potrzeby wyjaśnij, dlaczego Twoja aplikacja potrzebuje uprawnień.
  2. Poproś o uprawnienia ACCESS_FINE_LOCATION i ACCESS_COARSE_LOCATION jednocześnie. Użytkownik zezwolił już systemowi na przyznanie aplikacji dostępu do przybliżonej lokalizacji, więc tym razem okno systemowe będzie wyglądać inaczej, jak pokazano na rysunkach 4 i 5:
Okno zawiera opcje „Zmień na dokładną lokalizację”, „Tylko tym razem” i „Odrzuć”.
Rysunek 4. Użytkownik wybrał wcześniej opcje Przybliżona i Podczas używania aplikacji (w oknie z rysunku 3).
Okno zawiera opcje „Tylko tym razem” i „Odmów”.
Rysunek 5. Użytkownik wybrał wcześniej opcje Przybliżona i Tylko tym razem (w oknie z rysunku 3).

Najpierw poproś o dostęp do lokalizacji na pierwszym planie

Nawet jeśli kilka funkcji w aplikacji wymaga dostępu do lokalizacji, prawdopodobnie tylko niektóre z nich potrzebują dostępu do lokalizacji w tle. Dlatego zalecamy, aby aplikacja wysyłała prośby przyrostowe o dostęp do lokalizacji, najpierw na pierwszym planie, a potem o dostęp do lokalizacji w tle. Stosując żądania stopniowe, zapewniasz użytkownikom większą kontrolę i przejrzystość, ponieważ mogą oni lepiej zrozumieć, które funkcje aplikacji wymagają dostępu do lokalizacji w tle.

Rysunek 6 przedstawia przykład aplikacji, która jest przeznaczona do obsługi żądań przyrostowych. Funkcje „pokaż bieżącą lokalizację” i „poleć miejsca w pobliżu” wymagają dostępu do lokalizacji na pierwszym planie. Jednak tylko funkcja „polecania miejsc w pobliżu” wymaga dostępu do lokalizacji w tle.

Przycisk umożliwiający dostęp do lokalizacji na pierwszym planie znajduje się w odległości połowy długości ekranu od przycisku umożliwiającego dostęp do lokalizacji w tle.
Rysunek 6. Obie funkcje wymagają dostępu do lokalizacji, ale tylko funkcja „polecania obiektów w pobliżu” wymaga dostępu do lokalizacji w tle.

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

  1. Na początku aplikacja powinna kierować użytkowników do funkcji, które wymagają dostępu do lokalizacji na pierwszym planie, takich jak funkcja „udostępnij lokalizację” na rysunku 1 lub funkcja „pokaż bieżącą lokalizację” na rysunku 2.

    Zalecamy wyłączenie dostępu użytkowników do funkcji, które wymagają dostępu do lokalizacji w tle, dopóki aplikacja nie będzie miała dostępu do lokalizacji na pierwszym planie.

  2. Później, gdy użytkownik będzie korzystać z funkcji, które wymagają dostępu do lokalizacji w tle, możesz poprosić o dostęp do lokalizacji w tle.

Dodatkowe materiały

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

Codelabs

Filmy

Przykłady