Konum ayarlarını değiştirme

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

Bu derste, hangi ayarların etkin olduğunu kontrol etmek için Ayarlar İstemcisi'ni nasıl kullanacağınız ve kullanıcının ayarlarını tek bir dokunuşla güncellemesi için Konum Ayarları iletişim kutusunu nasıl sunacağınız gösterilmektedir.

Konum hizmetlerini yapılandırma

Google Play Hizmetleri ve birleştirilmiş konum sağlayıcı 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, bu özelliklerin kullanım alanlarına bağlı olarak konum izni istemelidir.

Konum isteği oluşturma

Birleştirilmiş konum sağlayıcıya gönderilen isteklerin parametrelerini depolamak için bir 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ını inceleyin. Bu derste, güncelleme aralığı, en hızlı güncelleme aralığı ve öncelik aşağıda açıklandığı şekilde belirlenir:

Güncelleme aralığı
setInterval() - Bu yöntem, uygulamanızın konum güncellemelerini tercih ettiği hızı milisaniye cinsinden belirler. Pil kullanımını optimize etmek için konum güncellemelerinin bu hızdan biraz daha hızlı veya yavaş olabileceğini ya da hiç güncelleme olmayabileceğini (ör. 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şleyebileceği en hızlı hızı milisaniye cinsinden belirler. Uygulamanız setInterval()'te belirtilen hızdan daha hızlı güncelleme almaktan yararlanmıyorsa bu yöntemi çağırmanız gerekmez.
Öncelik

setPriority() - Bu yöntem, isteğin önceliğini belirler. Bu da Google Play Hizmetleri konum hizmetlerine, kullanılacak konum kaynakları hakkında güçlü bir ipucu verir. Aşağıdaki değerler desteklenir:

  • PRIORITY_BALANCED_POWER_ACCURACY - Bir şehir bloğunun içindeki konum doğruluğu (yaklaşık 100 metre) isteğinde bulunmak için bu ayarı kullanın. Bu, kaba bir doğruluk düzeyi olarak kabul edilir ve daha az güç tüketir. Bu ayarda konum hizmetleri büyük olasılıkla kablosuz ağ ve baz istasyonu konumlandırmasını kullanır. Ancak konum sağlayıcı seçiminin, kullanılabilen kaynaklar gibi birçok faktöre bağlı olduğunu unutmayın.
  • PRIORITY_HIGH_ACCURACY - Mümkün olan en hassas konumu istemek için bu ayarı kullanın. Bu ayarda, konum hizmetlerinin konumu belirlemek için GPS kullanması daha olasıdır.
  • PRIORITY_LOW_POWER - Şehir düzeyinde kesinlik (yaklaşık 10 kilometrelik bir doğruluk) isteğinde bulunmak için bu ayarı kullanın. Bu, kaba bir doğruluk düzeyi olarak kabul edilir ve daha az güç tüketir.
  • PRIORITY_NO_POWER - Güç tüketimi üzerinde önemsiz bir etkiye ihtiyacınız varsa ancak mevcut olduğunda konum güncellemeleri almak istiyorsanız bu ayarı kullanın. Bu ayarda, uygulamanız herhangi bir konum güncellemesi tetiklemez ancak diğer uygulamalar tarafından tetiklenen konumları alır.

Konum isteğini oluşturun ve parametreleri bu 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 manifestinde tanımladığınız ACCESS_FINE_LOCATION izin ayarıyla ve 5.000 milisaniyelik (5 saniye) hızlı bir güncelleme aralığıyla birlikte, birleştirilmiş konum sağlayıcının birkaç metre içinde doğru konum güncellemeleri döndürmesine neden olur. Bu yaklaşım, konumu gerçek zamanlı olarak gösteren harita uygulamaları için uygundur.

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

Mevcut konum ayarlarını alma

Google Play Hizmetleri'ne ve konum hizmetleri API'sine bağlandıktan sonra kullanıcının cihazının mevcut konum ayarlarını alabilirsiniz. Bunu yapmak için bir LocationSettingsRequest.Builder oluşturun ve bir veya daha fazla konum isteği ekleyin. Aşağıdaki kod snippet'inde, önceki adımda oluşturulan konum isteğinin nasıl ekleneceği gösterilmektedir:

Kotlin

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

Java

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

Ardından, mevcut konum ayarlarının karşılanıp karşılanmadığı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 nesnesinin durum koduna bakarak konum ayarlarını kontrol edebilir. Uygulamanız, ilgili konum ayarlarının mevcut durumu hakkında daha da fazla ayrıntı almak için LocationSettingsResponse nesnesinin getLocationSettingsStates() yöntemini çağırabilir.

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

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

Aşağıdaki kod snippet'inde, kullanıcının konum ayarlarının konum hizmetlerinin LocationRequest oluşturmasına izin verip vermediğinin nasıl belirleneceği ve gerekirse kullanıcıdan konum ayarlarını değiştirme izninin nasıl isteneceği gösterilmektedir:

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

Sonraki derste, Konum Güncellemeleri Alma bölümünde, düzenli konum güncellemelerini nasıl alacağınız gösterilmektedir.