Pobieranie lokalizacji użytkownika
Podstawy Fused Location Provider
Pobieranie lokalizacji użytkownika to bezpłatna lekcja Android Academy na CoddyKit. To lekcja 2 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.
Gdzie znajduje się użytkownik?
Większość aplikacji korzystających z lokalizacji zaczyna od jednego pytania: gdzie urządzenie znajduje się w tej chwili? Android odpowiada na nie za pomocą Fused Location Provider, będącego częścią Google Play services.
W tej lekcji doda Pan/Pani zależność, pobierze pojedynczą lokalizację, nasłucha ciągłych aktualizacji i wyświetli wynik w Compose.
Dlaczego Fused Provider
Android ma kilka źródeł lokalizacji: GPS, Wi-Fi i stacje bazowe. Fused Location Provider inteligentnie łączy te źródła, aby zapewnić najlepszą lokalizację przy możliwie najmniejszym zużyciu baterii.
Obecnie prawie nigdy nie używa się bezpośrednio surowego LocationManager — klient fused jest prostszy i inteligentniejszy.
// build.gradle.kts (module)
dependencies {
implementation("com.google.android.gms:play-services-location:21.3.0")
}Deklarowanie uprawnienia
Lokalizacja jest zasobem wymagającym szczególnej ochrony. Proszę zadeklarować uprawnienie w pliku AndroidManifest.xml. Użyj ACCESS_FINE_LOCATION, aby uzyskać dokładne pozycjonowanie, lub ACCESS_COARSE_LOCATION, aby uzyskać lokalizację przybliżoną.
Samo zadeklarowanie uprawnienia to dopiero pierwszy krok — trzeba je również zażądać w czasie działania aplikacji (zostanie to omówione w późniejszej lekcji).
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />Tworzenie klienta fused
Pobierz FusedLocationProviderClient z LocationServices. W Compose pobierz kontekst za pomocą LocalContext.current i zapamiętaj klienta, aby nie był tworzony ponownie przy każdej rekompozycji.
import com.google.android.gms.location.LocationServices
@Composable
fun rememberFusedClient() = run {
val context = LocalContext.current
remember {
LocationServices.getFusedLocationProviderClient(context)
}
}Pobieranie ostatniej znanej lokalizacji
Najszybszą odpowiedzią jest lastLocation — ostatni pomiar, który system ma już zapisany w pamięci podręcznej. Zwracany jest obiekt Task, dlatego należy dołączyć listener powodzenia.
Wartość może wynosić null, jeśli żadna aplikacja nie żądała ostatnio lokalizacji, dlatego zawsze należy sprawdzać wartość null.
@SuppressLint("MissingPermission")
fun fetchLastLocation(
client: FusedLocationProviderClient,
onResult: (Location?) -> Unit
) {
client.lastLocation
.addOnSuccessListener { location -> onResult(location) }
.addOnFailureListener { onResult(null) }
}Oczekiwanie na Task za pomocą coroutine
Wywołania zwrotne szybko tworzą zagnieżdżenia. Biblioteka kotlinx-coroutines-play-services dodaje funkcję .await(), dzięki której można odczytać lokalizację za pomocą przejrzystego kodu zawieszającego.
import kotlinx.coroutines.tasks.await
@SuppressLint("MissingPermission")
suspend fun currentLastLocation(
client: FusedLocationProviderClient
): Location? {
return client.lastLocation.await()
}Żądanie aktualnej lokalizacji
lastLocation może być nieaktualna. Aby uzyskać bieżący pomiar, wywołaj getCurrentLocation z określonym priorytetem. PRIORITY_HIGH_ACCURACY używa GPS, a PRIORITY_BALANCED_POWER_ACCURACY oszczędza baterię.
import com.google.android.gms.location.Priority
import com.google.android.gms.location.CurrentLocationRequest
@SuppressLint("MissingPermission")
suspend fun freshLocation(
client: FusedLocationProviderClient
): Location? {
val request = CurrentLocationRequest.Builder()
.setPriority(Priority.PRIORITY_HIGH_ACCURACY)
.build()
return client.getCurrentLocation(request, null).await()
}Ciągłe aktualizacje lokalizacji
W przypadku nawigacji lub śledzenia potrzebny jest strumień aktualizacji. Utwórz LocationRequest z określonym interwałem, a następnie zarejestruj LocationCallback za pomocą requestLocationUpdates.
Po zakończeniu zawsze zatrzymuj aktualizacje, aby oszczędzać baterię.
import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationCallback
val request = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY,
5000L // 5 seconds
).build()
val callback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { /* use it */ }
}
}Aktualizacje jako Flow
Przejrzysty wzorzec opakowuje aktualizacje w callbackFlow, dzięki czemu odbiorcy mogą zbierać lokalizacje, a aktualizacje zatrzymują się automatycznie po zakończeniu zbierania za pomocą awaitClose.
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow
@SuppressLint("MissingPermission")
fun FusedLocationProviderClient.locationFlow(request: LocationRequest) = callbackFlow {
val cb = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { trySend(it) }
}
}
requestLocationUpdates(request, cb, Looper.getMainLooper())
awaitClose { removeLocationUpdates(cb) }
}Wyświetlanie lokalizacji w Compose
Zbieraj wynik w composable za pomocą LaunchedEffect przy jednorazowym odczycie lub collectAsStateWithLifecycle w przypadku strumienia. Następnie wyświetl współrzędne.
@Composable
fun LocationLabel(client: FusedLocationProviderClient) {
var location by remember { mutableStateOf<Location?>(null) }
LaunchedEffect(Unit) {
location = freshLocation(client)
}
Text(
location?.let { "Lat ${it.latitude}, Lng ${it.longitude}" }
?: "Locating..."
)
}Kompromis między baterią a dokładnością
Lokalizacja jest jednym z największych obciążeń baterii w aplikacjach mobilnych. Wybierz najniższą dokładność, która nadal spełnia wymagania, użyj najdłuższego akceptowalnego interwału aktualizacji i zawsze zatrzymuj aktualizacje, gdy ekran znika.
Wysoka dokładność i częste aktualizacje szybko wyczerpują baterię — należy używać ich tylko podczas aktywnej nawigacji.
Szybkie sprawdzenie
Potrzebuje Pan/Pani właśnie teraz pojedynczej, możliwie najdokładniejszej bieżącej pozycji, korzystając z funkcji zawieszającej. Które podejście będzie najlepsze?
Podsumowanie
Potrafi już Pan/Pani odczytywać lokalizację urządzenia:
- Dodać
play-services-locationi zadeklarowaćACCESS_FINE/COARSE_LOCATION. - Pobrać
FusedLocationProviderClientzLocationServices. - Użyć
lastLocationdla pomiaru z pamięci podręcznej, agetCurrentLocationdla nowego pomiaru. - Strumieniować aktualizacje za pomocą
requestLocationUpdates/callbackFlowi zatrzymywać je, aby oszczędzać baterię.
W następnej części narysuje Pan/Pani markery i przesunie kamerę do tych współrzędnych.
Często zadawane pytania
Czy lekcja „Pobieranie lokalizacji użytkownika” jest bezpłatna?
Tak — pełny tekst „Pobieranie lokalizacji użytkownika” 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 „Pobieranie lokalizacji użytkownika”?
Podstawy Fused Location Provider Ć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 2 z 4.
Ile czasu zajmuje lekcja „Pobieranie lokalizacji użytkownika”?
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