Konum güncellemeleri isteyin

Konum bilgilerinin uygun şekilde kullanılması, uygulamanızın kullanıcılarına fayda sağlayabilir. Örneğin, uygulamanız kullanıcının yürürken veya araba kullanırken yolunu bulmasına yardımcı oluyorsa ya da öğelerin konumunu izliyorsa düzenli aralıklarla cihazın konumunu 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 ve daha fazla bilgi, uygulamanızın çok kaynaklı konum sağlayıcıdan alabileceği Location nesnesinde bulunur. API, buna yanıt olarak uygulamanızı kablosuz ağ ve GPS (Küresel Konumlandırma Sistemi) gibi mevcut konum sağlayıcılara göre 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, birleşik konum sağlayıcıdaki requestLocationUpdates() yöntemini kullanarak bir cihazın konumuyla ilgili düzenli güncellemelerin nasıl isteneceği gösterilmektedir.

Bilinen son konumu alma

Cihazın bilinen son konumu, düzenli konum güncellemelerini başlatmadan önce uygulamanın bilinen bir konuma sahip olmasını sağlayarak başlangıç için kullanışlı bir temel sağlar. Bilinen Son Konumu Alma konulu derste, getLastLocation() çağrısı yaparak bilinen son konumu nasıl alacağınız gösterilmektedir. Aşağıdaki bölümlerdeki snippet'lerde, uygulamanızın bilinen son konumu zaten aldığı ve mCurrentLocation global değişkeninde Location nesnesi olarak sakladığı varsayılır.

Konum isteğinde bulunma

Uygulamanızın konum güncellemesi istemeden önce konum hizmetlerine bağlanması ve konum isteği göndermesi gerekir. Konum ayarlarını değiştirme konulu derste bu işlemi nasıl yapacağınız gösterilmektedir. Konum isteği gönderildikten sonra requestLocationUpdates() numaralı telefonu arayarak düzenli güncellemeleri başlatabilirsiniz.

Birleştirilmiş konum sağlayıcı, istek formuna bağlı olarak LocationCallback.onLocationResult() geri çağırma yöntemini çağırır ve ona bir Location nesnesi listesi iletir ya da 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, güncellemeyi LocationCallback geri çağırma yaklaşımını kullanarak nasıl alacağınız gösterilmektedir. LocationRequest sınıfının bir örneğini ve bir LocationCallback nesnesi ile requestLocationUpdates() işlevini çağırın. 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 etkinleştirip etkinleştirmediğini izlemek için kullanılan bir boole işaretçisi requestingLocationUpdates olduğunu unutmayın. Kullanıcılar konum güncellemelerini devre dışı bıraktıysa onları uygulamanızın konum şartı hakkında bilgilendirebilirsiniz. Boole işaretinin değerini etkinliğin örnekleri arasında 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'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 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ının gerekmemesi koşuluyla bu, güç tüketimini azaltmak için 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() işlevini çağırın ve işleve bir LocationCallback parametresi 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 requestingLocationUpdates boole 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:

Kotlin

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

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

Etkinliğin durumunu kaydetme

Ekran yönünde veya dilde yapılan bir değişiklik gibi cihaz yapılandırmasında yapılan değişiklikler, mevcut etkinliğin kaldırılmasına neden olabilir. Bu nedenle, uygulamanız etkinliği yeniden oluşturmak için ihtiyaç duyduğu tüm bilgileri saklamalı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);
}

Mevcutsa 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 Activity 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. Paylaşılan tercihi etkinliğinizin onPause() yönteminde ayarlayın ve onResume() yönteminde tercihi alın. Tercihleri kaydetme hakkında daha fazla bilgi için Anahtar/değer çiftlerini kaydetme başlıklı makaleyi inceleyin.

Ek kaynaklar

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

Örnekler

  • Android'de konum güncellemeleri alma işlemini gösteren örnek uygulama.