Konum bilgilerinin uygun şekilde kullanılması, uygulamanızın kullanıcıları için faydalı olabilir. Örneğin, uygulamanız yürürken veya araba kullanırken kullanıcıların yolunu bulmasına yardımcı oluyorsa ya da öğelerin konumunu izliyorsa cihazın konumunu düzenli aralıklarla alması gerekir. Coğrafi konumun (enlem ve boylam) yanı sıra kullanıcıya cihazın yönü (yatay seyahat yönü), rakımı veya hızı gibi daha fazla bilgi vermek isteyebilirsiniz. Bu bilgiler ve daha fazlası, uygulamanızın çok kaynaklı konum sağlayıcısından alabileceği Location
nesnesinde bulunur. Buna karşılık API, uygulamanızı WiFi ve GPS (Küresel Konumlandırma Sistemi) gibi şu anda kullanılabilen konum sağlayıcılara dayalı olarak mevcut en iyi konumla düzenli olarak günceller. Konumun doğruluğu sağlayıcılara, istediğiniz konum izinlerine ve konum isteğinde belirlediğiniz seçeneklere göre belirlenir.
Bu derste, çok kaynaklı konum sağlayıcıdaki requestLocationUpdates()
yöntemini kullanarak bir cihazın konumuyla ilgili düzenli güncelleme isteğinde nasıl bulunabileceğiniz gösterilmektedir.
Bilinen son konumu alma
Cihazın bilinen son konumu, düzenli konum güncellemelerine başlamadan önce
uygulamanın bilinen bir konuma sahip olmasını sağlayarak işe
başlamak için pratik bir temel sağlar. Bilinen Son Konumu Alma konulu derste, getLastLocation()
numarasını arayarak bilinen son konuma nasıl ulaşacağınız gösterilmektedir.
Aşağıdaki bölümlerde yer alan snippet'lerde, uygulamanızın bilinen son konumu zaten aldığı ve mCurrentLocation
genel değişkeninde Location
nesnesi olarak sakladığı varsayılmaktadır.
Konum isteğinde bulunma
Konum güncellemeleri istemeden önce uygulamanızın konum hizmetlerine bağlanması ve konum isteğinde bulunması gerekir. Konum Ayarlarını Değiştirme dersinde bunu nasıl yapacağınız gösterilmektedir. Konum isteği alındıktan sonra, requestLocationUpdates()
numarasını arayarak düzenli güncellemeleri başlatabilirsiniz.
İsteğin biçimine bağlı olarak, çok kaynaklı konum sağlayıcı LocationCallback.onLocationResult()
geri çağırma yöntemini çağırıp bu yönteme Location
nesnelerinin bir listesini iletir veya genişletilmiş verilerinde konumu içeren bir PendingIntent
yayınlar. Güncellemelerin doğruluğu ve sıklığı, istediğiniz konum izinlerinden ve konum isteği nesnesinde belirlediğiniz seçeneklerden etkilenir.
Bu derste, LocationCallback
geri çağırma yaklaşımını kullanarak güncellemeyi nasıl alacağınız gösterilmektedir. requestLocationUpdates()
yöntemini çağırarak LocationRequest
nesnesi örneğinizi ileterek bir LocationCallback
ekleyin.
Aşağıdaki kod örneğinde gösterildiği gibi bir startLocationUpdates()
yöntemi tanımlayın:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() } private fun startLocationUpdates() { fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()) }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } } private void startLocationUpdates() { fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper()); }
Yukarıdaki kod snippet'inin, kullanıcının konum güncellemelerini açıp kapatmadığını izlemek için kullanılan bir boole işaretine (requestingLocationUpdates
) karşılık geldiğine dikkat edin. Kullanıcılar konum güncellemelerini kapattıysa uygulamanızın konum gereksinimi hakkında onlara bilgi verebilirsiniz. Etkinlik örneklerinde boole işaretinin değerini koruma hakkında daha fazla bilgi için Etkinliğin Durumunu Kaydetme bölümüne bakın.
Konum güncelleme geri çağırmasını tanımlayın
Çok kaynaklı konum sağlayıcı, LocationCallback.onLocationResult()
geri çağırma yöntemini çağırır. Gelen bağımsız değişken, konumun enlem ve boylamını içeren bir liste Location
nesnesi içerir. Aşağıdaki snippet'te LocationCallback
arayüzünün nasıl uygulanacağı ve yöntemin nasıl tanımlanacağı, ardından konum güncellemesinin zaman damgasını nasıl alacağınız ve uygulamanızın kullanıcı arayüzünde enlem, boylam ve zaman damgasının nasıl görüntüleneceği gösterilmektedir:
Kotlin
private lateinit var locationCallback: LocationCallback // ... override fun onCreate(savedInstanceState: Bundle?) { // ... locationCallback = object : LocationCallback() { override fun onLocationResult(locationResult: LocationResult?) { locationResult ?: return for (location in locationResult.locations){ // Update UI with location data // ... } } } }
Java
private LocationCallback locationCallback; // ... @Override protected void onCreate(Bundle savedInstanceState) { // ... locationCallback = new LocationCallback() { @Override public void onLocationResult(LocationResult locationResult) { if (locationResult == null) { return; } for (Location location : locationResult.getLocations()) { // Update UI with location data // ... } } }; }
Konum güncellemelerini durdurma
Etkinlik artık odakta değilken (örneğin, kullanıcı başka bir uygulamaya geçtiğinde veya aynı uygulamadaki farklı bir etkinliğe geçtiğinde) konum güncellemelerini durdurmak isteyip istemediğinizi düşünün. Uygulamanın arka planda çalışırken bile bilgi toplaması gerekmediği sürece, bu özellik güç tüketimini azaltmak açısından yararlı olabilir. Bu bölümde, etkinliğin onPause()
yöntemindeki güncellemeleri nasıl durdurabileceğiniz gösterilmektedir.
Konum güncellemelerini durdurmak için aşağıdaki kod örneğinde gösterildiği gibi
removeLocationUpdates()
yöntemini çağırarak bir LocationCallback
iletin:
Kotlin
override fun onPause() { super.onPause() stopLocationUpdates() } private fun stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback) }
Java
@Override protected void onPause() { super.onPause(); stopLocationUpdates(); } private void stopLocationUpdates() { fusedLocationClient.removeLocationUpdates(locationCallback); }
Konum güncellemelerinin açık olup olmadığını izlemek için bir boole değeri (requestingLocationUpdates
) kullanın. Etkinliğin onResume()
yönteminde konum güncellemelerinin şu anda etkin olup olmadığını kontrol edin. Etkin değilse bunları etkinleştirin:
Kotlin
override fun onResume() { super.onResume() if (requestingLocationUpdates) startLocationUpdates() }
Java
@Override protected void onResume() { super.onResume(); if (requestingLocationUpdates) { startLocationUpdates(); } }
Etkinliğin durumunu kaydet
Cihazın yapılandırmasında yapılan bir değişiklik (ör. ekran yönü veya dilinin değiştirilmesi) mevcut etkinliğin silinmesine neden olabilir. Bu nedenle uygulamanız, etkinliği yeniden oluşturmak için ihtiyaç duyduğu tüm bilgileri depolamalıdır.
Bunu yapmanın bir yolu, Bundle
nesnesinde depolanan bir örnek durumunu kullanmaktır.
Aşağıdaki kod örneğinde, örnek durumunu kaydetmek için etkinliğin onSaveInstanceState()
geri çağırmasının nasıl kullanılacağı gösterilmektedir:
Kotlin
override fun onSaveInstanceState(outState: Bundle?) { outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates) super.onSaveInstanceState(outState) }
Java
@Override protected void onSaveInstanceState(Bundle outState) { outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates); // ... super.onSaveInstanceState(outState); }
Etkinliğin önceki örneğindeki kayıtlı değerleri (varsa) geri yüklemek için bir updateValuesFromBundle()
yöntemi tanımlayın. Aşağıdaki kod örneğinde gösterildiği gibi, etkinliğin onCreate()
yönteminden yöntemi çağırın:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { // ... updateValuesFromBundle(savedInstanceState) } private fun updateValuesFromBundle(savedInstanceState: Bundle?) { savedInstanceState ?: return // Update the value of requestingLocationUpdates from the Bundle. if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) { requestingLocationUpdates = savedInstanceState.getBoolean( REQUESTING_LOCATION_UPDATES_KEY) } // ... // Update UI to match restored state updateUI() }
Java
@Override public void onCreate(Bundle savedInstanceState) { // ... updateValuesFromBundle(savedInstanceState); } private void updateValuesFromBundle(Bundle savedInstanceState) { if (savedInstanceState == null) { return; } // Update the value of requestingLocationUpdates from the Bundle. if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) { requestingLocationUpdates = savedInstanceState.getBoolean( REQUESTING_LOCATION_UPDATES_KEY); } // ... // Update UI to match restored state updateUI(); }
Örnek durumunu kaydetme hakkında daha fazla bilgi için Android Etkinliği sınıf referansına bakın.
Not: Daha kalıcı bir depolama alanı için kullanıcının tercihlerini, uygulamanızın SharedPreferences
bölümünde depolayabilirsiniz. Etkinliğinizin onPause()
yönteminde paylaşılan tercihi ayarlayın ve onResume()
bölümünden tercihi alın.
Tercihleri kaydetme hakkında daha fazla bilgi için Anahtar/Değer Gruplarını Kaydetme konusunu okuyun.
Ek kaynaklar
Daha fazla bilgi edinmek için aşağıdaki kaynaklardan yararlanın:
Sana Özel
- Android'de konum güncellemelerini aldığınızı göstermek için örnek uygulama.