Uygulamanızdaki bir özellik için konum erişimi gerektiğinde, izin isteği göndermeden önce kullanıcının özellikle etkileşim kurmasını bekleyin. Bu iş akışı, uygulama izinlerinin nasıl isteneceğini açıklayan kılavuzda açıklandığı gibi, çalışma zamanında izin istemeyle ilgili en iyi uygulamayı izler.
Şekil 1'de bu işlemin nasıl yapılacağına dair bir örnek gösterilmektedir. Uygulama, ön planda konum erişimi gerektiren bir "konum paylaş" özelliği içeriyor. Ancak kullanıcı Konumu paylaş düğmesini seçene kadar uygulama 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ı izni istediğinde bile uygulamanızın yalnızca yaklaşık konum bilgilerini almasını isteyebilir.
Bu potansiyel kullanıcı davranışını ele almak için ACCESS_FINE_LOCATION
izinini tek başına istemeyin. Bunun yerine, tek bir çalışma zamanında istek göndererek hem ACCESS_FINE_LOCATION
iznine hem de ACCESS_COARSE_LOCATION
iznine başvurun. Yalnızca ACCESS_FINE_LOCATION
isteğinde bulunmaya ç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'e aşağıdaki hata mesajını kaydeder:
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Uygulamanız hem ACCESS_FINE_LOCATION
hem de ACCESS_COARSE_LOCATION
izni istediğinde sistem izinleri iletişim kutusu kullanıcıya aşağıdaki seçenekleri sunar:
- Tam: Uygulamanızın tam konum bilgisi almasına olanak tanır.
- Yaklaşık: Uygulamanızın yalnızca yaklaşık konum bilgisi almasına izin verir.
Şekil 3, iletişim kutusunun kullanıcının seçim yapmasına yardımcı olmak için her iki seçenek için de görsel bir ipucu içerdiğini gösterir. Kullanıcı, konum doğruluğuna karar verdikten sonra izin süresini seçmek için üç düğmeden birine dokunur.
Android 12 ve sonraki sürümlerde kullanıcılar, uygulamanın 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 çalıştıran bir cihaza yüklendikten sonra kullanıcının cihazı Android 12 veya sonraki bir sürüme yükseltmesi durumunda bile geçerlidir.
Kullanıcı seçimi, izin verme işlemlerini etkiler
Aşağıdaki tabloda, kullanıcının çalışma zamanında izinler iletişim kutusunda seçtiği seçeneklere göre sistemin uygulamanıza verdiği izinler gösterilmektedir:
Tam | 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 hassas konum erişimini yükseltmesini istemeden önce, uygulamanızın kullanım alanının bu düzeyde hassasiyet gerektirip gerektirmediğini düşünün. Uygulamanızın, bir cihazı Bluetooth veya kablosuz ağ üzerinden yakındaki cihazlarla eşlemesi gerekiyorsa ACCESS_FINE_LOCATION
iznini istemek yerine yardımcı cihaz eşleme veya Bluetooth izinlerini kullanabilirsiniz.
Kullanıcıdan uygulamanızın konum erişimini yaklaşıktan hassasa yükseltmesini istemek için aşağıdakileri yapın:
- Gerekirse uygulamanızın neden bu izne ihtiyacı olduğunu açıklayın.
ACCESS_FINE_LOCATION
veACCESS_COARSE_LOCATION
izinlerini tekrar birlikte isteyin. Kullanıcı, sistemin uygulamanıza yaklaşık konum izni vermesine daha önce izin verdiğinden, bu kez sistem iletişim kutusu şekil 4 ve şekil 5'te gösterildiği gibi farklıdır:
Başlangıçta yalnızca ön planda konum bilgisi isteğinde bulunun
Uygulamanızdaki birkaç özellik konum erişimi gerektirse bile bunların yalnızca bazılarının arka planda konum erişimi gerektirmesi muhtemeldir. 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 göndererek kullanıcılara daha fazla kontrol ve şeffaflık sunarsınız. Böylece, uygulamanızda hangi özelliklerin arka planda konum erişimine ihtiyacı olduğunu daha iyi anlayabilirler.
Şekil 6'da, artımlı istekleri işlemek için tasarlanmış bir uygulama örneği gösterilmektedir. Hem "mevcut konumu göster" hem de "yakındaki yerleri öner" özellikleri ön planda konum erişimi gerektirir. Ancak yalnızca "yakındaki yerleri öner" özelliği için arka planda konum erişimi gerekir.
Artımlı istek gerçekleştirme süreci aşağıdaki gibidir:
Uygulamanız ilk başta kullanıcıları ön planda konum erişimi gerektiren özelliklere (ör. Şekil 1'deki "konumu paylaş" özelliği veya Şekil 2'deki "mevcut konumu göster" özelliği) yönlendirmelidir.
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 isteğinde bulunabilirsiniz.
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.