Uygulamanızın konum istemesi veya izin güncellemeleri alması gerekiyorsa cihazda GPS ya da kablosuz ağ tarama gibi uygun sistem ayarlarının etkinleştirilmesi gerekir. Uygulamanız, cihazın GPS'i gibi hizmetleri doğrudan etkinleştirmek yerine gerekli doğruluk düzeyini/güç tüketimini ve istenen güncelleme aralığını belirtir. Cihaz da sistem ayarlarında otomatik olarak uygun değişiklikleri yapar. Bu ayarlar, LocationRequest
veri nesnesiyle 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 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 birleştirilmiş konum sağlayıcı tarafından sağlanan konum hizmetlerini kullanmak için uygulamanızı Settings Client'ı kullanarak 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 ayarlama
Ç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. Kullanılabilen 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ğıdaki gibi ayarlanır:
- Güncelleme aralığı
-
setIntervalMillis()
- 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 (ör. 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,setInterval()
içinde belirtilen orandan 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 sayede Google Play Hizmetleri konum hizmetlerine hangi konum kaynaklarının kullanılacağı konusunda güçlü bir ipucu verilir. Aşağıdaki değerler desteklenir:-
PRIORITY_BALANCED_POWER_ACCURACY
- Bu ayarı, konumun yaklaşık 100 metre doğrulukla bir şehir bloğu içinde olmasını istemek için kullanın. Bu, kaba bir doğruluk düzeyi olarak kabul edilir ve daha az güç tüketmesi beklenir. Bu ayarla birlikte konum hizmetleri büyük olasılıkla kablosuz ve baz istasyonu konumlandırmasını kullanır. Ancak konum sağlayıcı seçiminin, hangi kaynakların kullanılabildiği gibi birçok başka faktöre bağlı olduğunu unutmayın. -
PRIORITY_HIGH_ACCURACY
- Olabilecek en hassas konumun istenmesi için bu ayarı kullanın. Bu ayarla birlikte, konum hizmetlerinin konumu belirlemek için GPS'i kullanma olasılığı daha yüksektir. PRIORITY_LOW_POWER
- Bu ayarı, yaklaşık 10 kilometre doğrulukla şehir düzeyinde kesinlik istemek için kullanın. Bu, kaba doğruluk düzeyi olarak kabul edilir ve daha az güç tüketir.PRIORITY_PASSIVE
- Güç tüketimi üzerinde çok az etki olmasını istiyorsanız ancak konum güncellemelerini kullanıma sunulduğunda 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 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ştirilmiş konum sağlayıcının birkaç metre içinde doğru olan 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 konum güncellemesi aldıktan sonra ağa erişiyorsa veya uzun süren başka işlemler 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 işlem 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 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. İlgili konum ayarlarının mevcut durumu hakkında daha fazla bilgi edinmek için uygulamanız LocationSettingsResponse
nesnesinin getLocationSettingsStates()
yöntemini çağırabilir.
Kullanıcıya konum ayarlarını değiştirmesini isteme
Konum ayarlarının konum isteği için uygun olup olmadığını belirlemek üzere konum ayarlarını doğrulayan
OnFailureListener
öğesini
Task
nesnesine ekleyin. Ardından,
Exception
nesnesinin
onFailure()
yöntemine iletilip iletilmediğini kontrol edin. Bu, ayarların değiştirilmesi gerektiğini gösteren
ResolvableApiException
sınıfının bir örneğidir. Ardından,
startResolutionForResult()
işlevini çağırarak kullanıcının konum ayarlarını değiştirmesine izin vermesini 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 belirlemenin yanı sıra gerekirse konum ayarlarını değiştirme izni istemenin nasıl yapılacağını 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 İste'de, düzenli konum güncellemelerini nasıl alacağınız gösterilmektedir.