Android Academy · leksjon

Hente brukerens posisjon

Grunnleggende om Fused Location Provider.

Leksjon 2 av 413 trinn

Hente brukerens posisjon er en gratis leksjon i Android Academy på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Android Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Android Academy inneholder totalt 4 leksjoner.

Hvor er brukeren?

De fleste posisjonsbaserte apper starter med ett spørsmål: Hvor er enheten akkurat nå? Android svarer på dette gjennom Fused Location Provider, som er en del av Google Play-tjenester.

I denne leksjonen skal du legge til avhengigheten, be om én enkelt posisjon, lytte etter kontinuerlige oppdateringer og vise resultatet i Compose.

Hvorfor den sammenslåtte leverandøren?

Android har flere posisjonskilder: GPS, Wi-Fi og mobilmaster. Fused Location Provider kombinerer dem intelligent for å gi deg best mulig posisjon med minst mulig batteriforbruk.

Du bruker nesten aldri LocationManager direkte lenger – den sammenslåtte klienten er enklere og smartere.

// build.gradle.kts (module)
dependencies {
    implementation("com.google.android.gms:play-services-location:21.3.0")
}

Deklarere tillatelsen

Posisjon er en sensitiv ressurs. Deklarer tillatelsen i AndroidManifest.xml. Bruk ACCESS_FINE_LOCATION for presis posisjon eller ACCESS_COARSE_LOCATION for omtrentlig posisjon.

Å deklarere den er bare første steg – du må også be om den under kjøring (dette gjennomgås i en senere leksjon).

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Opprette den sammenslåtte klienten

Hent en FusedLocationProviderClient fra LocationServices. I Compose henter du konteksten med LocalContext.current og husker klienten, slik at den ikke opprettes på nytt ved hver rekombinering.

import com.google.android.gms.location.LocationServices

@Composable
fun rememberFusedClient() = run {
    val context = LocalContext.current
    remember {
        LocationServices.getFusedLocationProviderClient(context)
    }
}

Hente den sist kjente posisjonen

Det raskeste svaret er lastLocation – den nyeste posisjonsbestemmelsen systemet allerede har lagret i hurtigbufferet. Den returnerer en Task, så legg til en lytter for vellykket resultat.

Den kan være null hvis ingen app nylig har bedt om en posisjon, så kontroller alltid for null.

@SuppressLint("MissingPermission")
fun fetchLastLocation(
    client: FusedLocationProviderClient,
    onResult: (Location?) -> Unit
) {
    client.lastLocation
        .addOnSuccessListener { location -> onResult(location) }
        .addOnFailureListener { onResult(null) }
}

Vente på oppgaven med coroutiner

Tilbakekall blir raskt nøstet. Biblioteket kotlinx-coroutines-play-services legger til .await(), slik at du kan lese en posisjon med ryddig suspenderende kode.

import kotlinx.coroutines.tasks.await

@SuppressLint("MissingPermission")
suspend fun currentLastLocation(
    client: FusedLocationProviderClient
): Location? {
    return client.lastLocation.await()
}

Be om en fersk posisjon

lastLocation kan være utdatert. For en oppdatert posisjonsbestemmelse kaller du getCurrentLocation med en prioritet. PRIORITY_HIGH_ACCURACY bruker GPS, mens PRIORITY_BALANCED_POWER_ACCURACY sparer batteri.

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()
}

Kontinuerlige posisjonsoppdateringer

For navigasjon eller sporing trenger du en strøm av oppdateringer. Bygg en LocationRequest med et intervall, og registrer deretter en LocationCallback via requestLocationUpdates.

Stopp alltid oppdateringene når du er ferdig, for å spare batteri.

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 */ }
    }
}

Oppdateringer som en Flow

Et ryddig mønster pakker inn oppdateringene i en callbackFlow, slik at forbrukere samler inn posisjoner og oppdateringene stoppes automatisk når innsamlingen avsluttes, via 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) }
}

Vise posisjonen i Compose

Samle inn resultatet i en composable ved å bruke LaunchedEffect for en engangsavlesning eller collectAsStateWithLifecycle for en strøm. Vis deretter koordinatene.

@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..."
    )
}

Avveininger mellom batteri og nøyaktighet

Posisjon er en av de største batterikostnadene i mobilapper. Velg den laveste nøyaktigheten som fortsatt dekker behovene dine, bruk det lengste akseptable oppdateringsintervallet, og stopp alltid oppdateringene når skjermbildet forsvinner.

Høy nøyaktighet kombinert med hyppige oppdateringer tømmer batteriet raskt – reserver dette for aktiv navigasjon.

Hurtigsjekk

Du trenger den mest nøyaktige aktuelle posisjonen akkurat nå, ved hjelp av en suspenderende funksjon. Hvilken fremgangsmåte passer best?

Oppsummering

Nå kan du lese enhetens posisjon:

  • Legg til play-services-location og deklarer ACCESS_FINE/COARSE_LOCATION.
  • Hent en FusedLocationProviderClient fra LocationServices.
  • Bruk lastLocation for en lagret posisjonsbestemmelse og getCurrentLocation for en fersk.
  • Strøm oppdateringer via requestLocationUpdates / en callbackFlow, og stopp dem for å spare batteri.

Deretter skal vi tegne markører og flytte kameraet til disse koordinatene.

Gratis å komme i gang

Lær deg Kotlin med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
36
Leksjoner
152

Ofte stilte spørsmål

Er leksjonen «Hente brukerens posisjon» gratis?

Ja – du kan lese valgfritt 3 av leksjonene i læringsstien Android Academy, inkludert «Hente brukerens posisjon», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i Android Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Hente brukerens posisjon»?

Grunnleggende om Fused Location Provider. Du øver på Android Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Android Academy?

Ingen tidligere erfaring er nødvendig. Android Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Hente brukerens posisjon»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Android Academy-leksjonen?

Ja. Alle Android Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Vise et kart
  2. Hente brukerens posisjon
  3. Markører og kamera
  4. Riktige posisjonstillatelser
← Tilbake til Android Academy