0Pricing
Android Academy · Lekcja

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-location i zadeklarować ACCESS_FINE/COARSE_LOCATION.
  • Pobrać FusedLocationProviderClient z LocationServices.
  • Użyć lastLocation dla pomiaru z pamięci podręcznej, a getCurrentLocation dla nowego pomiaru.
  • Strumieniować aktualizacje za pomocą requestLocationUpdates / callbackFlow i 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

  1. Wyświetlanie mapy
  2. Pobieranie lokalizacji użytkownika
  3. Markery i kamera
  4. Prawidłowe uprawnienia do lokalizacji
← Powrót do Android Academy