Kullanıcının Konumunu Alma
Birleştirilmiş konum sağlayıcısının temelleri.
Kullanıcının Konumunu Alma, CoddyKit'te ücretsiz bir Android Academy dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Android Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Android Academy kursu toplamda 4 dersten oluşur.
Kullanıcı Nerede?
Konum kullanan çoğu uygulama tek bir soruyla başlar: cihaz şu anda nerede? Android bu soruyu Google Play hizmetlerinin bir parçası olan Fused Location Provider aracılığıyla yanıtlar.
Bu derste bağımlılığı ekleyecek, tek bir konum isteyecek, sürekli güncellemeleri dinleyecek ve sonucu Compose içinde göstereceksiniz.
Fused Provider Neden Kullanılır?
Android'in çeşitli konum kaynakları vardır: GPS, Wi-Fi ve baz istasyonları. Fused Location Provider, en az pil tüketimiyle en iyi konumu sağlamak için bunları akıllıca birleştirir.
Artık ham LocationManager'ı doğrudan neredeyse hiç kullanmazsınız; birleştirilmiş istemci daha basit ve daha akıllıdır.
// build.gradle.kts (module)
dependencies {
implementation("com.google.android.gms:play-services-location:21.3.0")
}İzni Bildirme
Konum, hassas bir kaynaktır. İzni AndroidManifest.xml dosyanızda bildirin. Kesin konumlandırma için ACCESS_FINE_LOCATION, yaklaşık konum için ACCESS_COARSE_LOCATION kullanın.
Bildirimi yapmak yalnızca ilk adımdır; çalışma zamanında da izin istemeniz gerekir (bu konu sonraki bir derste ele alınacaktır).
<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />Fused İstemciyi Oluşturma
LocationServices üzerinden bir FusedLocationProviderClient alın. Compose içinde bağlamı LocalContext.current ile alın ve her yeniden oluşturmada yeniden oluşturulmaması için istemciyi hatırlayın.
import com.google.android.gms.location.LocationServices
@Composable
fun rememberFusedClient() = run {
val context = LocalContext.current
remember {
LocationServices.getFusedLocationProviderClient(context)
}
}Bilinen Son Konumu Alma
En hızlı yanıt lastLocation değeridir; bu, sistemin önbelleğe aldığı en son konum bilgisidir. Bir Task döndürdüğü için başarı dinleyicisi ekleyin.
Yakın zamanda hiçbir uygulama konum istemediyse değer null olabilir; bu nedenle her zaman null kontrolü yapın.
@SuppressLint("MissingPermission")
fun fetchLastLocation(
client: FusedLocationProviderClient,
onResult: (Location?) -> Unit
) {
client.lastLocation
.addOnSuccessListener { location -> onResult(location) }
.addOnFailureListener { onResult(null) }
}Görev İçin Coroutines ile Bekleme
Geri çağırmalar kısa sürede iç içe geçer. kotlinx-coroutines-play-services kitaplığı, konumu temiz ve askıya alınabilir kodla okuyabilmeniz için .await() işlevini ekler.
import kotlinx.coroutines.tasks.await
@SuppressLint("MissingPermission")
suspend fun currentLastLocation(
client: FusedLocationProviderClient
): Location? {
return client.lastLocation.await()
}Güncel Konum İsteme
lastLocation güncel olmayabilir. Güncel bir konum bilgisi almak için getCurrentLocation işlevini bir öncelikle çağırın. PRIORITY_HIGH_ACCURACY GPS kullanır; PRIORITY_BALANCED_POWER_ACCURACY ise pil tasarrufu sağlar.
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()
}Sürekli Konum Güncellemeleri
Gezinme veya takip için bir güncelleme akışına ihtiyacınız vardır. Bir aralıkla LocationRequest oluşturun, ardından requestLocationUpdates aracılığıyla bir LocationCallback kaydedin.
Bitirdiğinizde pil tasarrufu yapmak için güncellemeleri her zaman durdurun.
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 */ }
}
}Akış Olarak Güncellemeler
Temiz bir yaklaşım, güncellemeleri bir callbackFlow içinde sarmalar. Böylece tüketiciler konumları toplar ve toplama işlemi awaitClose aracılığıyla sona erdiğinde güncellemeler otomatik olarak durur.
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) }
}Konumu Compose'ta Gösterme
Tek seferlik okuma için LaunchedEffect, akış içinse collectAsStateWithLifecycle kullanarak sonucu bir bileşim içinde toplayın. Ardından koordinatları görüntüleyin.
@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..."
)
}Pil ve Doğruluk Arasındaki Denge
Konum, mobil uygulamalarda pil tüketimini en çok artıran unsurlardan biridir. İhtiyaçlarınızı hâlâ karşılayan en düşük doğruluk düzeyini seçin, kabul edilebilir en uzun güncelleme aralığını kullanın ve ekran kapandığında güncellemeleri her zaman durdurun.
Yüksek doğruluk ve sık güncellemeler pili hızla tüketir; bunları etkin gezinme için ayırın.
Hızlı Kontrol
Askıya alınabilir bir işlev kullanarak tam şu anda en doğru tekil konumu almanız gerekiyor. Hangi yaklaşım en uygundur?
Özet
Artık cihazın konumunu okuyabilirsiniz:
play-services-locationbağımlılığını ekleyin veACCESS_FINE/COARSE_LOCATIONizinlerini bildirin.LocationServicesüzerinden birFusedLocationProviderClientalın.- Önbelleğe alınmış konum için
lastLocation, güncel konum içingetCurrentLocationkullanın. - Güncellemeleri
requestLocationUpdates/ bircallbackFlowüzerinden akıtın ve pil tasarrufu yapmak için durdurun.
Sırada: işaretçiler çizmek ve kamerayı bu koordinatlara taşımak var.
Sıkça Sorulan Sorular
“Kullanıcının Konumunu Alma” dersi ücretsiz mi?
Evet — “Kullanıcının Konumunu Alma” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Android Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Android Academy kursu toplamda 4 dersten oluşur.
“Kullanıcının Konumunu Alma” dersinde ne öğreneceğim?
Birleştirilmiş konum sağlayıcısının temelleri. Android Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Android Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Android Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Kullanıcının Konumunu Alma” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Android Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Android Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Harita Gösterme
- Kullanıcının Konumunu Alma
- İşaretçiler ve Kamera
- Konum İzinlerini Doğru Yönetme