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 bilgileri ve daha fazlasını şurada bulabilirsiniz: Location. veya çok kaynaklı konum sağlayıcı. 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. Sonuçların doğruluğu sağlayıcı tarafından belirlendiğinden, sahip olduğunuz konum izinleri istenen ve konum isteğinde belirlediğiniz seçenekler yer alır.

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ğinde bulunma

Konum güncellemesi istemeden önce uygulamanızın konuma bağlanması gerekir yapabilir ve konum isteğinde bulunabilirsiniz. Şu dersteki ders: Konum Ayarlarını Değiştirme bunu nasıl yapacağınızı gösterir. Konum isteği oluşturulduktan sonra, almak için requestLocationUpdates().

İ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. Testlerin doğruluğu ve sıklığı güncellemeler talep ettiğiniz konum izinlerinden ve Google'ın konum isteği nesnesinde belirlediğiniz seçeneklerdir.

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'i olduğuna dikkat edin. 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. Örneğin, boole flag'inin değerini koruma hakkında daha fazla bilgi Etkinlik 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 kullanın. 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 durdur

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 şu numarayı arayın: removeLocationUpdates() ona LocationCallback, aşağıdaki kod örneğinde gösterildiği gibidir:

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);
}

İzlemek için bir boole değeri (requestingLocationUpdates) kullanın konum güncellemelerinin açık olup olmadığı. 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 nesne algılandı.

Aşağıdaki kod örneğinde, etkinliğin onSaveInstanceState() geri çağırma işlevini kullanın:

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 Etkinlik sınıf referansı.

Not: Daha kalıcı bir depolama alanı için: kullanıcının tercihlerini uygulamanızda SharedPreferences. Paylaşılan tercihi şurada ayarlayın: etkinliğinizin onPause() yöntemi ve onResume() içinde tercihi alır. Tercihleri kaydetme hakkında daha fazla bilgi için şu bölümü okuyun: Kaydediliyor Anahtar/Değer Kümeleri.

Ek kaynaklar

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

Örnekler

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