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 przewodnikiem po minimalizowaniu liczby próśb o uprawnienia. Te materiały pomogą Ci zdecydować, o które uprawnienia poprosić i czy przycisk lokalizacji jest lepszą alternatywą w Twoim przypadku.
Wskazówki dotyczące uzyskiwania dostępu do uprawnień związanych z lokalizacją
Oto kilka ogólnych zasad, których należy przestrzegać przy decydowaniu o sposobie implementacji dostępu do lokalizacji w aplikacji.
Dostęp do lokalizacji w kontekście
Gdy funkcja w aplikacji wymaga dostępu do lokalizacji, przed wysłaniem prośby o uprawnienia musisz poczekać, aż użytkownik wejdzie z nią w interakcję. Jest to zgodne ze sprawdzoną metodą proszenia o uprawnienia w czasie działania aplikacji w kontekście, jak opisano w przewodniku, który wyjaśnia, jak prosić o uprawnienia aplikacji.
Rysunek 1 pokazuje, jak przeprowadzić ten proces. Aplikacja zawiera funkcję „udostępnianie lokalizacji”, która wymaga dostępu do lokalizacji na pierwszym planie. Aplikacja nie prosi jednak o uprawnienia dostępu 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 poradzić sobie z takim potencjalnym zachowaniem użytkowników, nie proś o samo ACCESS_FINE_LOCATION
uprawnienie. Zamiast tego w jednym żądaniu w czasie działania poproś o uprawnienie ACCESS_FINE_LOCATION 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 Twoja 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, w oknie uprawnień systemowych użytkownik ma do wyboru te opcje:
- Dokładna: umożliwia aplikacji uzyskiwanie dokładnych informacji o lokalizacji.
- Przybliżona: zezwala aplikacji na uzyskiwanie tylko przybliżonych informacji o lokalizacji.
Ilustracja 3 pokazuje, że okno zawiera wizualne wskazówki dotyczące obu opcji, aby ułatwić użytkownikowi wybór. Gdy użytkownik zdecyduje się na dokładność lokalizacji, kliknie jeden z 3 przycisków, aby wybrać czas trwania przyznania uprawnień.
Na urządzeniach z Androidem 12 lub nowszym użytkownicy mogą przejść do ustawień systemu, aby określić preferowaną dokładność lokalizacji dla dowolnej aplikacji, niezależnie od wersji pakietu SDK, na którą jest ona kierowana. Dotyczy to również sytuacji, gdy aplikacja jest zainstalowana na urządzeniu z Androidem 11 lub starszym, a potem użytkownik uaktualni urządzenie do Androida 12 lub nowszego.
ACCESS_COARSE_LOCATIONtylkoACCESS_FINE_LOCATION i ACCESS_COARSE_LOCATION.
Wybór użytkownika ma wpływ na przyznawanie uprawnień
W tabeli poniżej znajdziesz uprawnienia, które system przyznaje Twojej 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 sprawdzić, które uprawnienia system przyznał Twojej aplikacji, sprawdź wartość zwracaną przez żądanie uprawnień. Bibliotek Jetpack możesz używać w kodzie podobnym do tego poniżej. Możesz też używać 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 zaktualizowanie dostępu aplikacji z przybliżonej lokalizacji na dokładną lokalizację. Zanim poprosisz użytkownika o zwiększenie dostępu aplikacji do dokładnej lokalizacji, zastanów się, czy Twój przypadek użycia aplikacji bezwzględnie wymaga tego poziomu precyzji. Jeśli Twoja aplikacja musi sparować urządzenie z urządzeniami w pobliżu przez Bluetooth lub Wi-Fi, rozważ użycie parowania urządzeń towarzyszących lub uprawnień Bluetooth zamiast prosić o uprawnienie ACCESS_FINE_LOCATION.
Aby poprosić użytkownika o zaktualizowanie dostępu aplikacji do lokalizacji z przybliżonego na dokładny:
- W razie potrzeby wyjaśnij, dlaczego Twoja aplikacja potrzebuje tego uprawnienia.
- Ponownie poproś o uprawnienia
ACCESS_FINE_LOCATIONiACCESS_COARSE_LOCATION. Użytkownik zezwolił już systemowi na przyznanie aplikacji przybliżonej lokalizacji, więc okno systemowe wygląda tym razem inaczej, jak pokazano na rysunkach 4 i 5:
Początkowo proś tylko o lokalizację na pierwszym planie
Nawet jeśli kilka funkcji w aplikacji wymaga dostępu do lokalizacji, prawdopodobnie tylko niektóre z nich wymagają dostępu do lokalizacji w tle. Dlatego zalecamy, aby aplikacja wysyłała przyrostowe prośby o uprawnienia do lokalizacji, najpierw prosząc o dostęp do lokalizacji na pierwszym planie, a potem o dostęp do lokalizacji w tle. Dzięki żądaniom stopniowym użytkownicy mają większą kontrolę i zyskują większą przejrzystość, ponieważ mogą lepiej zrozumieć, które funkcje w aplikacji wymagają dostępu do lokalizacji w tle.
Na ilustracji 6 pokazano przykład aplikacji zaprojektowanej do obsługi żądań przyrostowych. Zarówno funkcja „pokaż bieżącą lokalizację”, jak i „polecaj miejsca w pobliżu” wymagają dostępu do lokalizacji na pierwszym planie. Tylko funkcja „polecaj pobliskie miejsca” wymaga dostępu do lokalizacji w tle.
Proces wykonywania przyrostowych żądań 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 ilustracji 1 lub funkcja „pokaż bieżącą lokalizację” na ilustracji 2.
Zalecamy wyłączenie dostępu użytkowników do funkcji, które wymagają dostępu do lokalizacji w tle, dopóki aplikacja nie uzyska dostępu do lokalizacji na pierwszym planie.
Później, gdy użytkownik będzie korzystać z funkcji wymagających dostępu do lokalizacji w tle, możesz poprosić o dostęp do lokalizacji w tle.
Dodatkowe materiały
Więcej informacji o uprawnieniach 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.