Konum ayarlarını değiştirme

Uygulamanızın konum bilgisi istemesi veya izin güncellemelerini alması gerekiyorsa cihazın GPS veya kablosuz ağ taraması gibi uygun sistem ayarlarını etkinleştirmesi gerekir. Uygulamanız, cihazın GPS'i gibi hizmetleri doğrudan etkinleştirmek yerine, gerekli doğruluk/güç tüketimi düzeyini ve istenen güncelleme aralığını belirtir ve cihaz, sistem ayarlarında uygun değişiklikleri otomatik olarak yapar. Bu ayarlar LocationRequest veri nesnesi tarafından tanımlanır.

Bu derste, etkin olan ayarları kontrol etmek için Ayarlar İstemcisi'nin nasıl kullanılacağı ve kullanıcıya, ayarlarını tek bir dokunuşla güncellemesi için Konum Ayarları iletişim kutusunun nasıl sunulacağı gösterilmektedir.

Konum hizmetlerini yapılandırma

Google Play Hizmetleri ve çok kaynaklı konum sağlayıcısı tarafından sağlanan konum hizmetlerini kullanmak için Ayarlar İstemcisi'ni kullanarak uygulamanızı bağlayın, ardından mevcut konum ayarlarını kontrol edin ve gerekirse kullanıcıdan gerekli ayarları etkinleştirmesini isteyin.

Özellikleri konum hizmetlerini kullanan uygulamalar, söz konusu özelliklerin kullanım alanlarına bağlı olarak konum izinleri istemelidir.

Konum isteği ayarlama

Çok kaynaklı konum sağlayıcısına gönderilen isteklerin parametrelerini depolamak için LocationRequest oluşturun. Parametreler, konum isteklerinin doğruluk düzeyini belirler. Mevcut tüm konum isteği seçenekleriyle ilgili ayrıntılar için LocationRequest sınıf referansına göz atın. Bu derste, aşağıda açıklandığı gibi güncelleme aralığı, en hızlı güncelleme aralığı ve öncelik ayarlanmaktadır:

Güncelleme aralığı
setInterval() - Bu yöntem, uygulamanızın konum güncellemelerini almayı tercih ettiği hızı milisaniye cinsinden ayarlar. Konum güncellemelerinin, pil kullanımını optimize etmek için bu hızdan biraz daha hızlı veya yavaş olabileceğini ya da hiç güncelleme olmayabileceğini (örneğin, cihazın bağlantısı yoksa) unutmayın.
En hızlı güncelleme aralığı
setFastestInterval() - Bu yöntem, uygulamanızın konum güncellemelerini işleyebildiği en hızlı hızı (milisaniye cinsinden) belirler. Uygulamanız, güncellemeleri setInterval() özelliğinde belirtilenden daha hızlı almıyorsa bu yöntemi çağırmanıza gerek yoktur.
Öncelik

setPriority() - Bu yöntem, isteğin önceliğini ayarlayarak Google Play Hizmetleri konum hizmetlerine hangi konum kaynaklarının kullanılacağı konusunda güçlü bir ipucu verir. Aşağıdaki değerler desteklenir:

  • PRIORITY_BALANCED_POWER_ACCURACY - Bir blok içinde konum hassasiyeti istemek için bu ayarı kullanın. Bu doğruluk yaklaşık 100 metrelik bir değerdir. Bu, genel bir doğruluk düzeyi olarak kabul edilir ve muhtemelen daha az güç tüketir. Bu ayarla, konum hizmetleri büyük olasılıkla kablosuz bağlantı ve baz istasyonu konumlandırmasını kullanır. Bununla birlikte, konum sağlayıcısı seçiminin, mevcut kaynaklar gibi diğer birçok faktöre bağlı olduğunu unutmayın.
  • PRIORITY_HIGH_ACCURACY - Mümkün olan en kesin konumu istemek için bu ayarı kullanın. Bu ayarla, konum hizmetlerinin konumu belirlemek için GPS kullanma olasılığı artar.
  • PRIORITY_LOW_POWER - Şehir düzeyinde hassasiyet istemek için bu ayarı kullanın. Bu, yaklaşık 10 kilometrelik bir doğruluk değeridir. Bu, genel bir doğruluk düzeyi olarak kabul edilir ve muhtemelen daha az güç tüketir.
  • PRIORITY_NO_POWER - Güç tüketimi üzerinde önemsiz bir etkiye ihtiyacınız varsa ancak mümkün olduğunda konum güncellemeleri almak istiyorsanız bu ayarı kullanın. Bu ayarla, uygulamanız konum güncellemelerini tetiklemez, ancak diğer uygulamalar tarafından tetiklenen konumları alır.

Konum isteğini oluşturun ve parametreleri şu kod örneğinde gösterildiği gibi ayarlayın:

Kotlin

fun createLocationRequest() {
  val locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

Java

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

PRIORITY_HIGH_ACCURACY önceliği, uygulama manifest dosyasında tanımladığınız ACCESS_FINE_LOCATION izin ayarıyla ve 5.000 milisaniyelik (5 saniye) hızlı güncelleme aralığıyla bir araya geldiğinde, çok kaynaklı konum sağlayıcısının birkaç metreye kadar doğru konum güncellemelerini döndürmesine neden olur. Bu yaklaşım, konumu gerçek zamanlı olarak gösteren eşleme uygulamaları için uygundur.

Performans ipucu: Uygulamanız konum güncellemesi aldıktan sonra ağa erişiyorsa veya başka uzun süreli çalışmalar yapıyorsa en hızlı aralığı daha yavaş bir değere ayarlayın. Bu ayarlama, uygulamanızın kullanamayacağı güncellemeleri almasını engeller. Uzun süren iş tamamlandıktan sonra, en hızlı aralığı tekrar hızlı bir değere ayarlayın.

Geçerli konum ayarlarını al

Google Play Hizmetleri'ne ve Konum Hizmetleri API'sine bağlandıktan sonra bir kullanıcının cihazının geçerli konum ayarlarını alabilirsiniz. Bunun için LocationSettingsRequest.Builder oluşturup bir veya daha fazla konum isteği ekleyin. Aşağıdaki kod snippet'i, önceki adımda oluşturulan konum isteğinin nasıl ekleneceğini gösterir:

Kotlin

val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(locationRequest);

Ardından, mevcut konum ayarlarının uygun olup olmadığını kontrol edin:

Kotlin

val builder = LocationSettingsRequest.Builder()

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

// ...

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

Task tamamlandığında uygulamanız, LocationSettingsResponse nesnesindeki durum koduna bakarak konum ayarlarını kontrol edebilir. Uygulamanız, ilgili konum ayarlarının mevcut durumu hakkında daha da fazla bilgi almak için LocationSettingsResponse nesnesinin getLocationSettingsStates() yöntemini çağırabilir.

Kullanıcıdan konum ayarlarını değiştirmesini iste

Konum ayarlarının konum isteği için uygun olup olmadığını belirlemek amacıyla konum ayarlarını doğrulayan Task nesnesine bir OnFailureListener ekleyin. Ardından, onFailure() yöntemine iletilen Exception nesnesinin, ayarların değiştirilmesi gerektiğini belirten ResolvableApiException sınıfının bir örneği olup olmadığını kontrol edin. Ardından, startResolutionForResult() yöntemini çağırarak kullanıcıdan konum ayarlarını değiştirme izni isteyen bir iletişim kutusu görüntüleyin.

Aşağıdaki kod snippet'i, kullanıcının konum ayarlarının konum hizmetlerinin bir LocationRequest oluşturmasına izin verip vermediğinin nasıl belirleneceğinin yanı sıra gerekirse konum ayarlarını değiştirmek için kullanıcıdan nasıl izin isteneceğini gösterir:

Kotlin

task.addOnSuccessListener { locationSettingsResponse ->
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}

task.addOnFailureListener { exception ->
    if (exception is ResolvableApiException){
        // Location settings are not satisfied, but this can be fixed
        // by showing the user a dialog.
        try {
            // Show the dialog by calling startResolutionForResult(),
            // and check the result in onActivityResult().
            exception.startResolutionForResult(this@MainActivity,
                    REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
            // Ignore the error.
        }
    }
}

Java

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

Bir sonraki ders olan Konum Güncellemelerini Alma'da, periyodik konum güncellemelerini nasıl alacağınız gösterilmektedir.