Çalışma zamanında konum erişimi istemeden önce konum erişimiyle ilgili seçenekleri ve en iyi uygulamaları ve izin isteklerinizi en aza indirmeyle ilgili kılavuzu inceleyin. Bu kaynaklar, hangi izni isteyeceğinize ve konum düğmesinin kullanım alanınız için daha iyi bir alternatif olup olmadığına karar vermenize yardımcı olur.
Konum izinlerine erişimle ilgili yönergeler
Uygulamanızda konum erişimini nasıl uygulayacağınıza karar verirken uymanız gereken bazı genel kurallar.
Konuma bağlam içinde erişme
Uygulamanızdaki bir özellik konum erişimi gerektirdiğinde izin isteğinde bulunmadan önce kullanıcının özellikle etkileşim kurmasını beklemeniz gerekir. Bu, uygulama izinleri isteme ile ilgili kılavuzda açıklandığı gibi, çalışma zamanında istenen izinleri bağlam içinde istemeyle ilgili en iyi uygulamaya uygundur.
Şekil 1'de bu işlemin nasıl yapılacağı gösterilmektedir. Uygulamada, ön planda konum erişimi gerektiren bir "konum paylaşma" özelliği var. Ancak uygulama, kullanıcı Konumu paylaş düğmesini seçene kadar konum izni istemez.
Kullanıcı yalnızca yaklaşık konum izni verebilir
Android 12 (API düzeyi 31) veya sonraki sürümlerde kullanıcılar, uygulamanız ACCESS_FINE_LOCATION çalışma zamanında istenen izin istese bile uygulamanızın yalnızca yaklaşık konum bilgilerini almasını talep edebilir.
Kullanıcının bu şekilde davranma olasılığına karşı ACCESS_FINE_LOCATION iznini tek başına istemeyin. Bunun yerine, tek bir çalışma zamanı isteğinde hem ACCESS_FINE_LOCATION iznini hem de ACCESS_COARSE_LOCATION iznini isteyin. Yalnızca ACCESS_FINE_LOCATION izni istemeye çalışırsanız sistem, Android 12'nin bazı sürümlerinde isteği yoksayar. Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa sistem, Logcat'te aşağıdaki hata mesajını günlüğe kaydeder:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Uygulamanız hem ACCESS_FINE_LOCATION hem de ACCESS_COARSE_LOCATION iznini istediğinde sistem izinleri iletişim kutusunda kullanıcıya aşağıdaki seçenekler sunulur:
- Tam: Uygulamanızın tam konum bilgilerini almasına izin verir.
- Yaklaşık: Uygulamanızın yalnızca yaklaşık konum bilgilerini almasına izin verir.
Şekil 3'te, kullanıcının seçim yapmasına yardımcı olmak için iletişim kutusunda her iki seçenek için de görsel bir ipucu gösterilmektedir. Kullanıcı, konum doğruluğuna karar verdikten sonra üç düğmeden birine dokunarak izin süresini seçer.
Android 12 ve sonraki sürümlerde kullanıcılar, hedef SDK sürümünden bağımsız olarak herhangi bir uygulama için tercih edilen konum doğruluğunu ayarlamak üzere sistem ayarlarına gidebilir. Bu durum, uygulamanız Android 11 veya daha eski bir sürümün yüklü olduğu bir cihaza yüklendikten sonra kullanıcı cihazı Android 12 veya daha yeni bir sürüme yükselttiğinde de geçerlidir.
ACCESS_COARSE_LOCATION istediğinde görünen sistem izinleri iletişim kutusu.ACCESS_FINE_LOCATION hem de ACCESS_COARSE_LOCATION istediğinde görünen sistem izinleri iletişim kutusu.
Kullanıcı tercihi, izinleri etkiler
Aşağıdaki tabloda, kullanıcının çalışma zamanında izin iletişim kutusunda seçtiği seçeneklere göre sistemin uygulamanıza verdiği izinler gösterilmektedir:
| Hassas | Yaklaşık | |
|---|---|---|
| Uygulamayı kullanırken | ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| Yalnız bu sefer | ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
| Reddet | Konum izni yok | Konum izni yok |
Sistemin uygulamanıza hangi izinleri verdiğini belirlemek için izin isteğinizin döndürdüğü değeri kontrol edin. Aşağıdakine benzer bir kodda Jetpack kitaplıklarını kullanabilir veya izin isteği kodunu kendiniz yönettiğiniz platform kitaplıklarını kullanabilirsiniz.
Kotlin
@RequiresApi(Build.VERSION_CODES.N) fun requestPermissions() { val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions: // https://developer.android.com/training/permissions/requesting#request-permission locationPermissionRequest.launch( arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) ) }
Java
private void requestPermissions() { ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = null; Boolean coarseLocationGranted = null; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); } if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION }); }
Tam konuma yükseltme isteğinde bulunma
Kullanıcıdan, uygulamanızın yaklaşık konum erişimini tam konum erişimine yükseltmesini isteyebilirsiniz. Ancak kullanıcıdan uygulamanızın tam konuma erişimini yükseltmesini istemeden önce, uygulamanızın kullanım alanının bu düzeyde bir hassasiyet gerektirip gerektirmediğini değerlendirin. Uygulamanızın bir cihazı Bluetooth veya kablosuz ağ üzerinden yakındaki cihazlarla eşlemesi gerekiyorsa ACCESS_FINE_LOCATION iznini istemek yerine ikincil cihaz eşleştirme veya Bluetooth izinlerini kullanabilirsiniz.
Kullanıcıdan uygulamanızın konum erişimini yaklaşık konumdan tam konuma yükseltmesini istemek için aşağıdakileri yapın:
- Gerekirse uygulamanızın neden bu izne ihtiyaç duyduğunu açıklayın.
ACCESS_FINE_LOCATIONveACCESS_COARSE_LOCATIONizinlerini tekrar birlikte isteyin. Kullanıcı, sistemin uygulamanıza yaklaşık konum izni vermesine daha önce izin verdiği için sistem iletişim kutusu bu kez farklıdır (Şekil 4 ve Şekil 5'te gösterildiği gibi):
Başlangıçta yalnızca ön planda konum erişimi isteyin
Uygulamanızdaki birden fazla özellik konum erişimi gerektirse bile muhtemelen yalnızca bazıları arka planda konum erişimi gerektiriyordur. Bu nedenle, uygulamanızın konum izinleri için artımlı istekler göndererek önce ön planda konum erişimi, ardından arka planda konum erişimi istemesi önerilir. Artımlı istekler gerçekleştirerek kullanıcılara daha fazla kontrol ve şeffaflık sağlarsınız. Böylece kullanıcılar, uygulamanızdaki hangi özelliklerin arka planda konum erişimine ihtiyaç duyduğunu daha iyi anlayabilir.
Şekil 6'da, artımlı istekleri işlemek için tasarlanmış bir uygulama örneği gösterilmektedir. "Mevcut konumu göster" ve "yakındaki yerleri öner" özelliklerinin her ikisi de ön planda konum erişimi gerektirir. Ancak yalnızca "yakındaki yerleri önerme" özelliği arka planda konum erişimi gerektiriyor.
Artımlı istekleri gerçekleştirme süreci aşağıdaki gibidir:
Uygulamanız ilk olarak kullanıcıları ön planda konum erişimi gerektiren özelliklere yönlendirmelidir. Örneğin, Şekil 1'deki "konum paylaş" özelliği veya Şekil 2'deki "mevcut konumu göster" özelliği.
Uygulamanız ön planda konum erişimine sahip olana kadar, arka planda konum erişimi gerektiren özelliklere kullanıcı erişimini devre dışı bırakmanız önerilir.
Daha sonra, kullanıcı arka planda konum erişimi gerektiren özellikleri keşfettiğinde arka planda konum erişimi isteyebilirsiniz.
Ek kaynaklar
Android'deki konum izinleri hakkında daha fazla bilgi için aşağıdaki materyalleri inceleyin:
Codelab uygulamaları
Videolar
Örnekler
- Konum izinlerinin kullanımını gösteren örnek uygulama