Prawidłowe uprawnienia do lokalizacji
Lokalizacja na pierwszym planie i dokładna lokalizacja
Prawidłowe uprawnienia do lokalizacji to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Android Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Android Academy zawiera 4 lekcji w sumie.
Uprawnienia są niezbędne
Lokalizacja jest jednym z najbardziej wrażliwych uprawnień Androida. Zadeklarowanie jej w manifeście nie wystarczy — na współczesnym Androidzie trzeba poprosić użytkownika o zgodę w czasie działania aplikacji i właściwie obsłużyć każdą odpowiedź.
W tej lekcji omówione zostaną poziomy uprawnień, żądanie ich w Compose, obsługa odmów oraz nowe zasady dotyczące lokalizacji dokładnej i przybliżonej oraz działania w tle.
Trzy uprawnienia do lokalizacji
Android dzieli lokalizację na poziomy:
ACCESS_COARSE_LOCATION— przybliżona (z dokładnością do okolic).ACCESS_FINE_LOCATION— dokładna (na poziomie GPS).ACCESS_BACKGROUND_LOCATION— dostęp, gdy aplikacja nie działa na pierwszym planie.
Proszę żądać tylko tych uprawnień, których rzeczywiście potrzeba. Dostęp w tle podlega dodatkowej kontroli w Play Store.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- only if truly needed: -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />Żądanie uprawnień w Compose
Interfejsy Activity Result API udostępniają launcher dla okien dialogowych uprawnień. W Compose użyj rememberLauncherForActivityResult wraz z kontraktem RequestMultiplePermissions.
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { result ->
val fine = result[Manifest.permission.ACCESS_FINE_LOCATION] == true
val coarse = result[Manifest.permission.ACCESS_COARSE_LOCATION] == true
// react to the user's choice
}Uruchamianie żądania
Wywołaj okno dialogowe za pomocą launch(), przekazując tablicę uprawnień — zwykle w reakcji na dotknięcie przycisku, a nie automatycznie podczas ładowania ekranu.
Button(onClick = {
launcher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}) {
Text("Enable location")
}Sprawdzanie, czy uprawnienie zostało już przyznane
Nie wyświetlaj ponownie prośby, jeśli uprawnienie zostało już przyznane. Przed uruchomieniem żądania sprawdź je za pomocą ContextCompat.checkSelfPermission.
import androidx.core.content.ContextCompat
import android.content.pm.PackageManager
fun hasFineLocation(context: Context): Boolean {
return ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
}Lokalizacja dokładna a przybliżona
Od Androida 12 (API 31) użytkownicy mogą przyznać dostęp do lokalizacji przybliżonej, nawet jeśli poproszono o dokładną. Dlatego należy żądać obu uprawnień — dokładnego i przybliżonego — jednocześnie oraz zaakceptować możliwość ograniczenia dostępu przez użytkownika do lokalizacji przybliżonej.
Jeśli to możliwe, należy zaprojektować funkcję tak, aby działała poprawnie również z lokalizacją przybliżoną.
// Request both — the system shows a Precise/Approximate toggle
launcher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
// If only COARSE comes back granted, you got approximate location.Wyświetlanie uzasadnienia
Jeśli użytkownik odmówił raz, Android pozwala sprawdzić shouldShowRequestPermissionRationale. Gdy wartość jest równa true, przed ponownym żądaniem wyświetl przyjazne wyjaśnienie, dlaczego potrzebujesz lokalizacji.
import androidx.core.app.ActivityCompat
val shouldExplain = ActivityCompat.shouldShowRequestPermissionRationale(
activity,
Manifest.permission.ACCESS_FINE_LOCATION
)
if (shouldExplain) {
// show a dialog: "We use your location to find nearby stores"
}Obsługa trwałej odmowy
Jeśli użytkownik wybierze opcję Nie pytaj ponownie (lub odmówi dwa razy), system nie wyświetli już okna dialogowego. Jedynym rozwiązaniem jest przekierowanie użytkownika do ustawień aplikacji, gdzie może ręcznie włączyć uprawnienie.
import android.content.Intent
import android.provider.Settings
import android.net.Uri
fun openAppSettings(context: Context) {
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", context.packageName, null)
)
context.startActivity(intent)
}Korzystanie z Accompanist Permissions
Biblioteka accompanist-permissions opakowuje całą tę obsługę w stan wygodny dla Compose. rememberMultiplePermissionsState śledzi stan przyznania uprawnień i udostępnia wywołanie launchMultiplePermissionRequest().
import com.google.accompanist.permissions.rememberMultiplePermissionsState
val permissions = rememberMultiplePermissionsState(
listOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
if (permissions.allPermissionsGranted) {
// show the map / read location
} else {
Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
Text("Grant location")
}
}Zasady lokalizacji w tle
Lokalizacja w tle wymaga dwuetapowego przepływu: najpierw należy przyznać dostęp do lokalizacji na pierwszym planie (dokładnej/przybliżonej), a następnie osobno poprosić o ACCESS_BACKGROUND_LOCATION, co w systemie Android 11 i nowszych otwiera ustawienia systemowe. Sklep Play wymaga jasnego uzasadnienia oraz polityki prywatności.
Należy prosić o ten dostęp tylko wtedy, gdy aplikacja rzeczywiście potrzebuje lokalizacji po zamknięciu — na przykład do geofencingu lub śledzenia treningu.
// Step 1: request foreground first and confirm it's granted.
// Step 2: only then request background:
launcher.launch(
arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
// On Android 11+ this sends the user to settings to pick "Allow all the time".Mapa chroniona uprawnieniem
Połączmy te elementy: uzależnij wyświetlanie mapy od stanu uprawnienia. Pokaż mapę dopiero po przyznaniu uprawnienia, a w przeciwnym razie wyświetl prośbę o jego przyznanie. To standardowy wzorzec, który szanuje użytkownika.
@Composable
fun LocationGate(permissions: MultiplePermissionsState) {
when {
permissions.allPermissionsGranted -> MapScreen()
else -> Column {
Text("We need location to show nearby places.")
Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
Text("Allow location")
}
}
}
}Szybkie sprawdzenie
Od Androida 12 użytkownik może wybrać lokalizację przybliżoną zamiast dokładnej. Co oznacza to dla żądania uprawnienia?
Podsumowanie
Wiesz już, jak odpowiedzialnie prosić o dostęp do lokalizacji:
- Zadeklaruj lokalizację przybliżoną/dokładną (a lokalizację w tle tylko wtedy, gdy jest niezbędna) w manifeście.
- Proś o uprawnienia w czasie działania aplikacji za pomocą Activity Result APIs lub
accompanist-permissions. - Proś jednocześnie o lokalizację dokładną i przybliżoną, aby obsłużyć przełącznik dokładnej/przybliżonej lokalizacji.
- Wyświetl uzasadnienie i przekieruj użytkowników, którzy trwale odmówili uprawnienia, do ustawień aplikacji.
- Obsługuj lokalizację w tle jako osobny, uzasadniony, dwuetapowy proces.
To kończy moduł Mapy i usługi lokalizacyjne — możesz wyświetlać mapę, znajdować użytkownika, umieszczać znaczniki i prawidłowo prosić o uprawnienia.
Ucz się Kotlin dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 36
- Lekcje
- 152
Często zadawane pytania
Czy lekcja „Prawidłowe uprawnienia do lokalizacji” jest bezpłatna?
Tak — pełny tekst „Prawidłowe uprawnienia do lokalizacji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Android Academy, przejdź na CoddyKit PRO. Kurs Android Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Prawidłowe uprawnienia do lokalizacji”?
Lokalizacja na pierwszym planie i dokładna lokalizacja Ćwiczysz Android Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Android Academy?
Nie wymagamy żadnego doświadczenia. Android Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.
Ile czasu zajmuje lekcja „Prawidłowe uprawnienia do lokalizacji”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Android Academy?
Tak. Każda lekcja Android Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wyświetlanie mapy
- Pobieranie lokalizacji użytkownika
- Markery i kamera
- Prawidłowe uprawnienia do lokalizacji