Konum güncellemeleri isteyin

Konum bilgilerinin uygun şekilde kullanılması Google uygulamasını indirin. Örneğin, uygulamanız kullanıcının yürürken yolunu bulmasına yardımcı oluyorsa veya veya uygulamanız öğelerin konumunu izliyorsa düzenli aralıklarla izleyin. Şirketlerin yanı sıra (enlem ve boylam) öne çıkarıyorsanız, kullanıcıya daha ayrıntılı yön (yatay seyahat yönü), rakım veya durmasına yol açabilir. Bu ve daha fazla bilgi, uygulamanızın çok kaynaklı konum sağlayıcıdan alabileceği Location nesnesinde bulunur. Buna karşılık API, uygulamanızı belirli aralıklarla mevcut konuma göre, mevcut en iyi konum GPS (Küresel Konumlandırma Sistemi) gibi sağlayıcılar için geçerlidir. Konumun doğruluğu, sağlayıcılara, istediğiniz konum izinlerine ve konum isteğinde belirlediğiniz seçeneklere göre belirlenir.

Bu ders, bir cihazın konum bilgilerini requestLocationUpdates() yöntemini kullanabilirsiniz.

Bilinen son konumu alma

Cihazın bilinen son konumu, saptamak için gereken başlamadan önce, uygulamanın bilinen bir konuma sahip olduğundan emin olarak periyodik konum güncellemeleri. Şu dersteki ders: Bilinen Son Konumu alma bölümünde, arayarak bilinen son konumu nasıl öğrenebilirim getLastLocation(). Aşağıdaki bölümlerde yer alan snippet'ler, uygulamanızın bilinen son konumu aldı ve bunu Genel değişkende Location nesnesi mCurrentLocation.

Konum isteği gönderme

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.

İsteğin biçimine bağlı olarak, çok kaynaklı konum sağlayıcısı şunu çağırır: LocationCallback.onLocationResult() geri çağırma yöntemini kullanır ve bu yönteme Location nesnelerinin bir listesini iletir veya CANNOT TRANSLATE PendingIntent öğesini tıklayın. Güncellemelerin doğruluğu ve sıklığı, istediğiniz konum izinlerinden ve konum isteği nesnesinde belirlediğiniz seçeneklerden etkilenir.

Bu derste, LocationCallback yaklaşımını benimseyin. Telefonla arama requestLocationUpdates(), örneğinizi geçirerek LocationRequest nesne, ve LocationCallback. 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 bir boole flag'ine requestingLocationUpdates, kullanıcının konum bilgisini açıp açmadığını izlemek için kullanılır açık veya kapalı konuma getirin. Kullanıcılar konum güncellemelerini devre dışı bıraktıysa bilgi verebilirsiniz: hakkında daha fazla bilgi edinin. 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ğı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 bir liste içeriyor Location konumun enlem ve boylamını içeren nesne. Aşağıdaki snippet nasıl uygulayacağınızı gösterir LocationCallback arayüzünü kullanıp yöntemi tanımlayın, ardından konum güncellemesinin zaman damgasını alın ve enlem, boylam ve zaman damgasını uygulamanızın kullanıcısına görüntüleyin arayüz:

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 olduğunda konum güncellemelerini durdurmak isteyip istemediğinizi düşünün başka bir uygulamaya veya başka bir uygulamaya geçmesi gibi aynı uygulamada farklı etkinlikler. Bu, gücü azaltmak için faydalı olabilir uygulamanın tüketilmesi durumunda bile veri toplaması gerekmemesi arka planda çalışıyor. Bu bölümde, Search Ads 360'ta etkinliğin onPause() yöntemini çağırın.

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 etkin olup olmadığını izlemek için requestingLocationUpdates boole değerini kullanın. Etkinliğin onResume() yöntemi, kontrol edin Konum güncellemelerinin şu anda etkin olup olmadığını ve etkin değilse bunları etkinleştirebilirsiniz:

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 bir değişiklik (ör. ekrandaki bir değişiklik) mevcut etkinliğin yok edilmesine neden olabilir. Sizin Bu nedenle uygulamanın, etkinliği yeniden oluşturmak için ihtiyaç duyduğu tüm bilgileri depolaması gerekir. Bunu yapmanın bir yolu, Bundle nesnesinde depolanan bir örnek durumudur.

Aşağıdaki kod örneğinde, örneğin 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);
}

Geri yüklemek için updateValuesFromBundle() yöntemi tanımlayın etkinliğin önceki örneğine ait kayıtlı değerler kullanılabilir. Etkinlikten yöntemi çağırın onCreate() yöntemini kullanarak şu kod örneğine bakalım:

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ızda SharedPreferences. 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.