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 araç kullanırken yolunu bulmasına yardımcı oluyorsa ya da öğelerin konumunu takip ediyorsa 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 hareket 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ıdan alabileceği Location nesnesinde mevcuttur. Buna yanıt olarak API, uygulamanızı mevcut konum sağlayıcılara (ör. kablosuz ağ ve GPS (Küresel Konum Belirleme Sistemi)) göre mevcut en iyi konumla düzenli olarak günceller. Konumun doğruluğu; sağlayıcılar, istediğiniz konum izinleri ve konum isteğinde ayarladığınız seçenekler tarafından belirlenir.
Bu derste, çok kaynaklı konum sağlayıcıdaki requestLocationUpdates() yöntemini kullanarak bir cihazın konumuyla ilgili düzenli güncellemeleri nasıl isteyeceğiniz gösterilmektedir.
Bilinen son konumu alma
Cihazın bilinen son konumu, başlamak için kullanışlı bir temel sağlar ve periyodik konum güncellemeleri başlatılmadan önce uygulamanın bilinen bir konuma sahip olmasını sağlar. Bilinen Son Konumu Alma ile ilgili ders, getLastLocation() yöntemini çağırarak bilinen son konumu nasıl alacağınızı gösterir.
Aşağıdaki bölümlerdeki snippet'ler, uygulamanızın bilinen son konumu zaten aldığını ve bunu mCurrentLocation global değişkeninde bir Location nesnesi olarak depoladığını varsayar.
Konum isteğinde bulunma
Uygulamanızın konum güncellemeleri isteyebilmesi için 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() yöntemini çağırarak düzenli güncellemeleri başlatabilirsiniz.
İsteğin biçimine bağlı olarak, birleştirilmiş konum sağlayıcı LocationCallback.onLocationResult() geri çağırma yöntemini çağırır ve Location nesnelerinin bir listesini iletir ya da 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 ayarladığınız 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ğırın ve LocationRequest nesnesinin örneğini ve bir LocationCallback nesnesini 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 kapatmadığını izlemek için kullanılan bir Boole işaretine (requestingLocationUpdates) atıfta bulunduğuna dikkat edin. Kullanıcılar konum güncellemelerini kapattıysa onları uygulamanızın konumla ilgili koşulları hakkında bilgilendirebilirsiniz. Etkinlik örnekleri arasında boole işaretinin değerini koruma hakkında daha fazla bilgi için Etkinliğin Durumunu Kaydetme başlıklı makaleyi inceleyin.
Konum güncelleme geri çağırma işlevini tanımlama
Ç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, LocationCallback arayüzünün nasıl uygulanacağını ve yöntemin nasıl tanımlanacağını, ardından konum güncellemesinin zaman damgasının nasıl alınacağını ve uygulamanızın kullanıcı arayüzünde enlem, boylam ve zaman damgasının nasıl gösterileceğini gösterir:
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 olmadığında (ör. kullanıcı başka bir uygulamaya 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ı gerekmiyorsa bu, güç tüketimini azaltmak için kullanışlı olabilir. Bu bölümde, etkinliğin onPause() yönteminde güncellemeleri nasıl durdurabileceğiniz gösterilmektedir.
Konum güncellemelerini durdurmak için aşağıdaki kod örneğinde gösterildiği gibi LocationCallback ileterek removeLocationUpdates() yöntemini çağırın:
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 etkin olup olmadığını izlemek için boole (requestingLocationUpdates) kullanın. Etkinliğin onResume() yönteminde, konum güncellemelerinin 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 kaydetme
Cihazın yapılandırmasında yapılan bir değişiklik (ör. ekran yönünün veya dilin değiştirilmesi), mevcut etkinliğin yok edilmesine neden olabilir. Bu nedenle, uygulamanızın etkinliği yeniden oluşturmak için ihtiyaç duyduğu tüm bilgileri depolaması gerekir.
Bunu yapmanın bir yolu, Bundle nesnesinde depolanan örnek durumunu kullanmaktır.
Aşağıdaki kod örneğinde, örnek durumunu kaydetmek için etkinliğin onSaveInstanceState() geri çağırma işlevinin 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ğinden kaydedilen 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ı depolama alanı için kullanıcının tercihlerini uygulamanızın SharedPreferences bölümünde saklayabilirsiniz. Paylaşılan tercihi etkinliğinizin onPause() yönteminde ayarlayın ve tercihi onResume() yönteminde alın.
Tercihleri kaydetme hakkında daha fazla bilgi için Anahtar/Değer Kümelerini Kaydetme başlıklı makaleyi okuyun.
Ek kaynaklar
Daha fazla bilgi edinmek için aşağıdaki kaynaklardan yararlanabilirsiniz:
Örnekler
- Android'de konum güncellemeleri almayı gösteren örnek uygulama.