Konum bilgilerinin uygun şekilde kullanılması, uygulamanızın kullanıcıları için faydalı olabilir. Örneğin, uygulamanız, kullanıcının yürürken veya araba kullanırken yolunu bulmasına yardımcı oluyorsa veya öğ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 konumu (yatay seyahat yönü), rakım veya hızı gibi ek bilgiler de verebilirsiniz. Bu bilgiler ve daha fazlası, uygulamanızın çok kaynaklı konum sağlayıcıdan alabileceği Location
nesnesinde bulunur. Buna karşılık olarak API, uygulamanızı WiFi ve GPS (Küresel Konumlandırma Sistemi) gibi mevcut konum sağlayıcılara göre düzenli olarak mevcut en iyi konumla günceller. Konumun doğruluğu
sağlayıcılar,
istediğiniz konum izinleri ve konum isteğinde ayarladığınız seçeneklere göre belirlenir.
Bu derste, çok kaynaklı konum sağlayıcıda requestLocationUpdates()
yöntemini kullanarak bir cihazın konumu hakkında nasıl düzenli güncelleme isteneceği gösterilmektedir.
Bilinen son konumu alma
Cihazın bilinen son konumu, başlamak için pratik bir taban sağlar. Bu sayede, periyodik konum güncellemelerine başlamadan önce uygulamanın bilinen bir konuma sahip olması sağlanır. Bilinen Son Konumu Alma dersinde, getLastLocation()
numaralı telefonu arayarak bilinen son konumu nasıl alacağınızı öğrenebilirsiniz.
Aşağıdaki bölümlerde yer alan snippet'ler, uygulamanızın bilinen son konumu zaten aldığını ve mCurrentLocation
genel değişkeninde Location
nesnesi olarak depoladığını varsayar.
Konum isteğinde bulunma
Uygulamanızın konum güncellemesi isteğinde bulunmadan önce 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 oluşturulduktan sonra requestLocationUpdates()
numaralı telefonu 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ır ve bu yönteme Location
nesne listesini iletir veya genişletilmiş verilerinde konumu içeren bir PendingIntent
gönderir. Güncellemelerin doğruluğu ve sıklığı, istediğiniz konum izinlerinden ve konum isteği nesnesinde ayarladığınız seçeneklerden etkilenir.
Bu derste, LocationCallback
geri çağırma yaklaşımını kullanarak güncellemeyi nasıl alabileceğiniz gösterilmektedir. requestLocationUpdates()
işlevini çağırarak
LocationRequest
nesnesi örneğinizi
ve bir
LocationCallback
iletin.
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 açmadığını izlemek için kullanılan requestingLocationUpdates
boole işaretini belirttiğine dikkat edin. Kullanıcılar konum güncellemelerini devre dışı bıraktıysa kendilerine uygulamanızın konum gereksinimini bildirebilirsiniz. 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ın nasıl alınacağı 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 durdur
Etkinlik artık odakta değilken (örneğin, kullanıcı başka bir uygulamaya veya aynı uygulama içinde 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ı gerekmiyorsa güç tüketimini azaltmak için bu
pratik olabilir. Bu bölümde, etkinliğin onPause()
yönteminde güncellemeleri nasıl durdurabileceğiniz gösterilmektedir.
Konum güncellemelerini durdurmak için removeLocationUpdates()
yöntemini çağırın ve aşağıdaki kod örneğinde gösterildiği gibi 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 şu anda 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 ve etkin değilse 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 yapılandırmasında yapılan bir değişiklik (ör. ekran yönünde veya dilde değişiklik), mevcut etkinliğin kaldırılmasına neden olabilir. Bu nedenle
uygulamanız, etkinliği yeniden oluşturmak için gereken 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); }
Varsa etkinliğin önceki örneğindeki kayıtlı değerleri 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 saklayabilirsiniz. Etkinliğinizin onPause()
yönteminde paylaşılan tercihi ayarlayın ve onResume()
içinde tercihi alın.
Tercihleri kaydetme hakkında daha fazla bilgi için Anahtar/Değer Kümelerini Kaydetme bölümüne bakın.
Ek kaynaklar
Daha fazla bilgi edinmek için aşağıdaki kaynaklardan yararlanın:
Numuneler
- Android'de konum güncellemelerinin alındığını gösteren örnek uygulama.