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ę.
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.
ACCESS_COARSE_LOCATION.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ą:
- W razie potrzeby wyjaśnij, dlaczego Twoja aplikacja potrzebuje uprawnień.
- Poproś o uprawnienia
ACCESS_FINE_LOCATIONiACCESS_COARSE_LOCATIONjednocześ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:
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.
Proces wykonywania żądań przyrostowych wygląda tak:
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.
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
- Przykładowa aplikacja demonstrująca użycie uprawnień dostępu do lokalizacji.