Konum güncellemeleri isteyin

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ının yolunu bulmasına yardımcı oluyorsa ya da varlıkların konumunu takip ediyorsa cihazın konumunu düzenli aralıklarla alması gerekir. Coğrafi konumun (enlem ve boylam) yanı sıra kullanıcılara cihazın yönü (yatay hareket yönü), yüksekliği veya hızı gibi daha fazla bilgi vermek isteyebilirsiniz. Bu ve daha fazla bilgi, uygulamanızın çok kaynaklı konum sağlayıcıdan alabileceği Location nesnesinde yer alır. Buna karşılık API, uygulamanızı Wi-Fi ve GPS (Küresel Konumlandırma Sistemi) gibi şu anda kullanılabilen konum sağlayıcılara göre 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, birleştirilmiş 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şlangıç için kullanışlı bir temel sağlar. Böylece, uygulama periyodik konum güncellemelerini başlatmadan önce bilinen bir konuma sahip olur. Bilinen Son Konumu Alma başlıklı derste, getLastLocation()'ı arayarak bilinen son konumu nasıl alacağınız gösterilmektedir. Aşağıdaki bölümlerdeki snippet'lerde, uygulamanızın bilinen son konumu daha önce aldığı ve bunu genel değişkendeki Location nesnesi olarak depoladığı varsayılır mCurrentLocation.

Konum isteğinde bulunma

Uygulamanızın konum güncellemeleri isteğinde bulunabilmesi için konum hizmetlerine bağlanması ve konum isteğinde bulunması gerekir. Konum Ayarlarını Değiştirme dersinde bu işlemin nasıl yapılacağı gösterilmektedir. Konum isteği gönderildikten sonra requestLocationUpdates() numarasını arayarak düzenli güncellemeleri başlatabilirsiniz.

Birleştirilmiş konum sağlayıcı, isteğin biçimine bağlı olarak LocationCallback.onLocationResult() geri çağırma yöntemini çağırır ve bu yönteme Location nesnelerinin 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 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. Call requestLocationUpdates(), passing it your instance of the LocationRequest object, and a LocationCallback. Aşağıdaki kod örneğinde gösterildiği gibi bir startLocationUpdates() yöntemi tanımlayın:

KotlinJava
override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}
@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 etkinleştirip etkinleştirmediğini izlemek için kullanılan bir Boole işaretine, requestingLocationUpdates, atıfta bulunduğunu unutmayın. Kullanıcılar konum güncellemelerini devre dışı bıraktıysa uygulamanızın konum gereksinimi hakkında onları bilgilendirebilirsiniz. Etkinliğin ö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ğırmasını 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 enlemini 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 enlem, boylam ve zaman damgasının uygulamanızın kullanıcı arayüzünde nasıl gösterileceği açıklanmaktadır:

KotlinJava
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
                // ...
            }
        }
    }
}
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 odaklanılmıyorken (ör. kullanıcı başka bir uygulamaya veya aynı uygulamada 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 durumlarda bu, güç tüketimini azaltmak için kullanışlı 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() işlevini çağırıp LocationCallback değerini iletin: removeLocationUpdates(), passing it a LocationCallback, as shown in the following code sample:

KotlinJava
override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}
@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

Konum güncellemelerinin şu anda etkin olup olmadığını izlemek için bir boole değeri olan requestingLocationUpdates değerini kullanın. Etkinliğin onResume() yönteminde, konum güncellemelerinin şu anda etkin olup olmadığını kontrol edin ve etkin değilse etkinleştirin:

KotlinJava
override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}
@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ü veya dil değişikliği), mevcut etkinliğin yok olmasına neden olabilir. Bu nedenle, uygulamanız etkinliği yeniden oluşturmak için gereken tüm bilgileri saklamalıdır. Bunu yapmanın bir yolu, Bundle nesnesinde depolanan bir örnek durumu 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:

KotlinJava
override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}
@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

Etkinliğin önceki örneğinde kaydedilen değerler varsa bunları geri yüklemek için bir updateValuesFromBundle() yöntemi tanımlayın. Aşağıdaki kod örneğinde gösterildiği gibi, yöntemi etkinliğin onCreate() yönteminden çağırın:

KotlinJava
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()
}
@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 Activity sınıfı referansına bakın.

Not: Daha kalıcı bir depolama 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() içinde alın. Tercihleri kaydetme hakkında daha fazla bilgi için Anahtar/değer kümelerini kaydetme başlıklı makaleyi inceleyin.

Ek kaynaklar

Daha fazla bilgi edinmek için aşağıdaki kaynaklardan yararlanın:

Örnekler

  • Android'de konum güncellemelerinin nasıl alındığını gösteren örnek uygulama.