Uygulamanızın konum bilgisi istemesi veya izin güncellemelerini alması gerekiyorsa cihazın GPS ya da 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. Böylece, cihaz sistem ayarlarında uygun değişiklikleri otomatik olarak 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'ın (Ayarlar İstemcisi) nasıl kullanılacağı ve kullanıcının tek bir dokunuşla ayarlarını 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, bu özelliklerin kullanım alanlarına bağlı olarak konum izinleri istemelidir.
Konum isteği oluşturun
Çok kaynaklı konum sağlayıcıya yapılan 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ını inceleyin. Bu derste güncelleme aralığı, en hızlı güncelleme aralığı ve önceliği aşağıda açıklandığı gibi 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ın, güncellemelerisetInterval()
içinde belirtilen hızdan daha hızlı alması mümkün değilse bu yöntemi çağırmanız gerekmez. - Öncelik
-
setPriority()
- Bu yöntem, isteğin önceliğini ayarlar. Bu da 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 şehir bloğu için konum hassasiyeti isteğinde bulunmak için bu ayarı kullanın. Bu, yaklaşık 100 metrelik bir doğruluk sağlar. Bu, genel bir doğruluk seviyesi olarak kabul edilir ve muhtemelen daha az güç tüketir. Bu ayar seçildiğinde 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ı seçiminin, hangi kaynakların mevcut olduğu 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 ayar kullanıldığında, 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 sağlar. Bu, genel bir doğruluk seviyesi olarak kabul edilir ve muhtemelen daha az güç tüketir.PRIORITY_NO_POWER
- Güç tüketimi üzerinde ihmal edilebilir düzeyde bir etkiye ihtiyacınız varsa ancak mümkün olduğunda konum güncellemelerini almak istiyorsanız bu ayarı kullanın. Bu ayar kullanıldığında, uygulamanız konum güncellemelerini 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ğinin, uygulama manifest dosyasında tanımladığınız ACCESS_FINE_LOCATION
izin ayarı ve 5.000 milisaniyelik (5 saniye) hızlı güncelleme aralığıyla bir arada kullanılması, çok kaynaklı konum sağlayıcının birkaç metreden daha doğru konum güncellemeleri döndürmesine neden olur.
Bu yaklaşım, konumu gerçek zamanlı olarak gösteren haritalama uygulamaları için uygundur.
Performans ipucu: Uygulamanız bir 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 ayar, uygulamanızın kullanamayacağı güncellemeleri almasını engeller. Uzun süreli çalışma 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. Bunu yapmak için LocationSettingsRequest.Builder
oluşturup 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 geçerli 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 geçerli 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
Task
nesnesine konum ayarlarını doğrulayan 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 kutusunu 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ğini nasıl belirleneceğini ve gerekirse konum ayarlarını değiştirme izninin nasıl 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. } } } });
Konum Güncellemelerini Alma adlı bir sonraki ders, düzenli konum güncellemelerini nasıl alacağınızı gösterir.