Hente brukerens posisjon
Grunnleggende om Fused Location Provider.
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-locationog deklarerACCESS_FINE/COARSE_LOCATION. - Hent en
FusedLocationProviderClientfraLocationServices. - Bruk
lastLocationfor en lagret posisjonsbestemmelse oggetCurrentLocationfor en fersk. - Strøm oppdateringer via
requestLocationUpdates/ encallbackFlow, og stopp dem for å spare batteri.
Deretter skal vi tegne markører og flytte kameraet til disse koordinatene.
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
- Vise et kart
- Hente brukerens posisjon
- Markører og kamera
- Riktige posisjonstillatelser