Mendapatkan Lokasi Pengguna
Asas pembekal lokasi tergabung.
Mendapatkan Lokasi Pengguna ialah pelajaran Android Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Android Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Android Academy merangkumi sejumlah 4 pelajaran.
Di Manakah Pengguna?
Kebanyakan aplikasi yang menggunakan lokasi bermula dengan satu soalan: di manakah peranti berada sekarang? Android menjawabnya melalui Fused Location Provider, sebahagian daripada perkhidmatan Google Play.
Dalam pelajaran ini, anda akan menambahkan kebergantungan, meminta satu lokasi, mendengar kemas kini berterusan dan memaparkan hasilnya dalam Compose.
Mengapa Menggunakan Fused Provider
Android mempunyai beberapa sumber lokasi: GPS, Wi-Fi dan menara sel. Fused Location Provider menggabungkannya secara bijak untuk memberikan lokasi terbaik dengan penggunaan bateri yang paling rendah.
Anda hampir tidak pernah menggunakan LocationManager mentah secara langsung lagi — klien fused lebih mudah dan lebih pintar.
// build.gradle.kts (module)
dependencies {
implementation("com.google.android.gms:play-services-location:21.3.0")
}Mengisytiharkan Keizinan
Lokasi ialah sumber yang sensitif. Isytiharkan keizinan tersebut dalam AndroidManifest.xml anda. Gunakan ACCESS_FINE_LOCATION untuk kedudukan tepat atau ACCESS_COARSE_LOCATION untuk kedudukan anggaran.
Mengisytiharkannya hanyalah langkah pertama — anda juga mesti memintanya semasa aplikasi berjalan (akan diterangkan dalam pelajaran seterusnya).
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />Mencipta Klien Fused
Dapatkan FusedLocationProviderClient daripada LocationServices. Dalam Compose, dapatkan konteks menggunakan LocalContext.current dan ingat klien tersebut supaya klien tidak dicipta semula pada setiap komposisi semula.
import com.google.android.gms.location.LocationServices
@Composable
fun rememberFusedClient() = run {
val context = LocalContext.current
remember {
LocationServices.getFusedLocationProviderClient(context)
}
}Mendapatkan Lokasi Terakhir yang Diketahui
Jawapan terpantas ialah lastLocation — pembetulan lokasi terkini yang telah dicache oleh sistem. Ia mengembalikan Task, jadi lampirkan pendengar kejayaan.
Nilainya boleh menjadi null jika tiada aplikasi meminta lokasi baru-baru ini, jadi sentiasa lakukan semakan null.
@SuppressLint("MissingPermission")
fun fetchLastLocation(
client: FusedLocationProviderClient,
onResult: (Location?) -> Unit
) {
client.lastLocation
.addOnSuccessListener { location -> onResult(location) }
.addOnFailureListener { onResult(null) }
}Menunggu Task dengan Coroutine
Panggilan balik mudah bertingkat dengan cepat. Pustaka kotlinx-coroutines-play-services menambahkan .await() supaya anda boleh membaca lokasi menggunakan kod penangguhan yang kemas.
import kotlinx.coroutines.tasks.await
@SuppressLint("MissingPermission")
suspend fun currentLastLocation(
client: FusedLocationProviderClient
): Location? {
return client.lastLocation.await()
}Meminta Lokasi Terkini
lastLocation mungkin sudah lapuk. Untuk mendapatkan pembetulan terkini, panggil getCurrentLocation dengan keutamaan. PRIORITY_HIGH_ACCURACY menggunakan GPS; PRIORITY_BALANCED_POWER_ACCURACY menjimatkan 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()
}Kemas Kini Lokasi Berterusan
Untuk navigasi atau penjejakan, anda memerlukan strim kemas kini. Bina LocationRequest dengan selang masa, kemudian daftarkan LocationCallback melalui requestLocationUpdates.
Sentiasa hentikan kemas kini apabila selesai untuk menjimatkan 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 */ }
}
}Kemas Kini sebagai Flow
Pendekatan yang kemas membungkus kemas kini dalam callbackFlow, supaya pengguna mengumpulkan lokasi dan kemas kini berhenti secara automatik apabila pengumpulan berakhir melalui 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) }
}Memaparkan Lokasi dalam Compose
Kumpulkan hasil dalam komponen boleh gubah menggunakan LaunchedEffect untuk bacaan sekali sahaja, atau collectAsStateWithLifecycle untuk strim. Kemudian paparkan koordinat tersebut.
@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..."
)
}Pertukaran antara Bateri dan Ketepatan
Lokasi merupakan salah satu penggunaan bateri terbesar dalam aplikasi mudah alih. Pilih ketepatan paling rendah yang masih memenuhi keperluan anda, gunakan selang masa kemas kini paling panjang yang boleh diterima dan sentiasa hentikan kemas kini apabila skrin tidak lagi dipaparkan.
Ketepatan tinggi + kemas kini kerap akan menghabiskan bateri dengan cepat — simpan tetapan ini untuk navigasi aktif.
Semakan Ringkas
Anda memerlukan kedudukan semasa yang paling tepat dengan serta-merta, menggunakan fungsi penangguhan. Pendekatan manakah yang paling sesuai?
Imbas Kembali
Sekarang anda boleh membaca lokasi peranti:
- Tambahkan
play-services-locationdan isytiharkanACCESS_FINE/COARSE_LOCATION. - Dapatkan
FusedLocationProviderClientdaripadaLocationServices. - Gunakan
lastLocationuntuk pembetulan yang dicache dangetCurrentLocationuntuk pembetulan terkini. - Strimkan kemas kini melalui
requestLocationUpdates/callbackFlow, dan hentikannya untuk menjimatkan bateri.
Seterusnya: melukis penanda dan menggerakkan kamera ke koordinat tersebut.
Pelajari Kotlin dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 36
- Pelajaran
- 152
Soalan Lazim
Adakah pelajaran “Mendapatkan Lokasi Pengguna” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Android Academy, termasuk “Mendapatkan Lokasi Pengguna”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Android Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mendapatkan Lokasi Pengguna”?
Asas pembekal lokasi tergabung. Anda berlatih Android Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Android Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Android Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Mendapatkan Lokasi Pengguna” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Android Academy ini?
Ya. Setiap pelajaran Android Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Memaparkan Peta
- Mendapatkan Lokasi Pengguna
- Penanda dan Kamera
- Kebenaran Lokasi dengan Cara yang Betul