Konum güncellemeleri isteyin

Konum bilgilerinin uygun şekilde kullanımı, uygulamanızın kullanıcıları için faydalı olabilir. Örneğin, uygulamanız yürürken veya araba kullanırken kullanıcının yollarını 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ıdan alabileceği Location nesnesinde bulunur. Buna karşılık olarak API, kablosuz ağ ve GPS (Küresel Konumlandırma Sistemi) gibi şu anda kullanılabilen konum sağlayıcılara dayanarak uygulamanızı 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 ayarladığınız 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üncellemeleri nasıl isteyeceğiniz gösterilmektedir.

Bilinen son konumu alma

Cihazın bilinen son konumu, uygulamanın periyodik konum güncellemelerine başlamadan önce bilinen bir konuma sahip olmasını sağlayarak, başlayabileceğiniz faydalı bir temel oluşturur. Bilinen Son Konumu Alma dersinde, getLastLocation() numarasını arayarak bilinen son konuma nasıl ulaşacağınız gösterilmektedir. Aşağıdaki bölümlerdeki snippet'lerde, uygulamanızın bilinen son konumu zaten aldığı ve mCurrentLocation genel değişkeninde Location nesnesi olarak depoladığı varsayılmaktadır.

Konum isteğinde bulunma

Uygulamanızın konum güncellemeleri istemeden ö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 yapıldığında, requestLocationUpdates() yöntemini çağırarak düzenli güncellemeleri başlatabilirsiniz.

İsteğin biçimine bağlı olarak, çok kaynaklı konum sağlayıcı ya LocationCallback.onLocationResult() geri çağırma yöntemini çağırıp bu yönteme 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ğırarak LocationRequest nesnesi örneğinizi ve bir LocationCallback parametresini 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şaretini (requestingLocationUpdates) belirttiğine dikkat edin. Kullanıcılar konum güncellemelerini kapatmışsa uygulamanızın konum gereksinimini kendilerine bildirebilirsiniz. Etkinliğin ö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, 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ı nasıl alacağınızı ve uygulamanızın kullanıcı arayüzünde enlem, boylam ve zaman damgasını nasıl görüntüleyeceğinizi 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 durdur

Kullanıcı başka bir uygulamaya geçiş yapması veya aynı uygulamadaki farklı bir etkinlik gibi etkinlikler artık odakta değilken konum güncellemelerini durdurmak isteyip istemediğinizi değerlendirin. Uygulamanın arka planda çalışırken bile bilgi toplaması gerekmediği sürece bu özellik, 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 removeLocationUpdates() adlı operatöre 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 (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ünün veya dilin değiştirilmesi) mevcut etkinliğin silinmesine neden olabilir. Dolayısıyla 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 etkinlikte 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ğ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() seçeneğinde tercihi alın. Tercihleri kaydetme hakkında daha fazla bilgi için Anahtar/Değer Kümelerini 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.