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'i gibi hizmetleri doğrudan etkinleştirmek yerine gerekli doğruluk/güç tüketimi düzeyini ve istenen güncelleme aralığını belirtir. Cihaz, sistem ayarlarında otomatik olarak uygun değişiklikleri yapar. Bu ayarlar, LocationRequest veri nesnesi tarafından tanımlanır.
Bu derste, hangi ayarların etkinleştirildiğini kontrol etmek için Settings Client'ı 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 göstereceğiniz açıklanmaktadır.
Konum hizmetlerini yapılandırma
Google Play Hizmetleri ve çok kaynaklı konum sağlayıcı tarafından sunulan konum hizmetlerini kullanmak için Settings Client'ı 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 izinleri istemelidir.
Konum isteği oluşturma
Çok kaynaklı konum sağlayıcıya gönderilen isteklerin parametrelerini depolamak için bir LocationRequest oluşturun.
Parametreler, konum isteklerinin doğruluk düzeyini belirler. Kullanılabilir tüm konum isteği seçenekleriyle ilgili ayrıntılar için LocationRequest sınıf referansına bakın. Bu derste güncelleme aralığı, en hızlı güncelleme aralığı ve öncelik aşağıda açıklandığı şekilde ayarlanır:
- Güncelleme aralığı
-
setIntervalMillis()- Bu yöntem, uygulamanızın konum güncellemelerini almak istediği sıklığı milisaniye cinsinden ayarlar. Konum güncellemelerinin, pil kullanımını optimize etmek için bu hızdan biraz daha hızlı veya daha 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ığı
-
setMinUpdateIntervalMillis()- Bu yöntem, uygulamanızın konum güncellemelerini işleyebileceği en hızlı hızı milisaniye cinsinden ayarlar. UygulamanızınsetInterval()içinde belirtilen hızdan daha hızlı güncelleme alması gerekmiyorsa bu yöntemi çağırmanız gerekmez. - Öncelik
-
setPriority()- Bu yöntem, isteğin önceliğini belirler. Bu sayede Google Play Hizmetleri konum hizmetlerine, hangi konum bilgisi kaynaklarının kullanılacağı konusunda güçlü bir ipucu verilir. Aşağıdaki değerler desteklenir:-
PRIORITY_BALANCED_POWER_ACCURACY- Konum hassasiyetinin bir şehir bloğu içinde (yaklaşık 100 metre doğruluk) olmasını istemek için bu ayarı kullanın. Bu, kaba bir doğruluk düzeyi olarak kabul edilir ve muhtemelen daha az güç tüketir. Bu ayar etkinleştirildiğinde 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, hangi kaynakların kullanılabilir olduğu gibi diğer birçok faktöre bağlı olduğunu unutmayın. -
PRIORITY_HIGH_ACCURACY- Mümkün olan en tam konumu istemek için bu ayarı kullanın. Bu ayar etkinleştirildiğinde konum hizmetlerinin konumu belirlemek için GPS kullanma olasılığı daha yüksektir. PRIORITY_LOW_POWER- Şehir düzeyinde kesinlik (yaklaşık 10 kilometrelik bir doğruluk) istemek için bu ayarı kullanın. Bu, yaklaşık bir doğruluk düzeyi olarak kabul edilir ve muhtemelen daha az güç tüketir.PRIORITY_PASSIVE- Güç tüketimi üzerinde önemsiz bir etkiye ihtiyaç duyuyorsanız ancak mümkün olduğunda konum güncellemelerini almak istiyorsanız bu ayarı kullanın. Bu ayar sayesinde 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(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build() }
Java
protected void createLocationRequest() { LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build(); }
PRIORITY_HIGH_ACCURACY önceliği, uygulama manifestinde tanımladığınız ACCESS_FINE_LOCATION izin ayarı ve 5.000 milisaniyelik (5 saniye) hızlı güncelleme aralığıyla birleştiğinde birleşik konum sağlayıcının birkaç metre hassasiyetle 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 düzenleme, 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 nesnesindeki durum koduna bakarak konum ayarlarını kontrol edebilir. Uygulamanız, ilgili konum ayarlarının mevcut durumu hakkında daha fazla bilgi edinmek 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 amacıyla
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() yöntemini çağırarak kullanıcıdan konum ayarlarını değiştirme izni isteyen bir iletişim kutusu gösterin.
Aşağıdaki kod snippet'i, kullanıcının konum ayarlarının konum hizmetlerinin
LocationRequest oluşturmasına izin verip vermediğini nasıl belirleyeceğinizi ve gerekirse konum ayarlarını değiştirmek için kullanıcıdan nasıl izin isteyeceğinizi 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üncellemeleri İsteme, düzenli konum güncellemelerini nasıl alacağınızı gösterir.