Uygulamanızdaki bir özellik konum erişimi gerektirdiğinde izin isteğinde bulunmadan önce kullanıcının bu özellikle etkileşim kurmasını bekleyin. Bu iş akışı, uygulama izinleri isteme konusunu açıklayan kılavuzda belirtildiği gibi, çalışma zamanı izinlerinin bağlam içinde istenmesiyle ilgili en iyi uygulamaya uygundur.
Şekil 1'de bu işlemin nasıl yapılacağına dair bir örnek gösterilmektedir. Uygulamada, ön plan konum erişimi gerektiren bir "konum paylaşma" özelliği var. Uygulama, kullanıcı Konum 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ı iznini istese bile yalnızca yaklaşık konum bilgilerini almasını isteyebilir.
Bu olası kullanıcı davranışını ele almak için 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
isteğinde bulunursanı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ı için aşağıdaki seçenekler yer alır:
- 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, iletişim kutusunda kullanıcının seçim yapmasına yardımcı olmak için her iki seçenekle ilgili görsel bir ipucu bulunduğu gösteriliyor. 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, sistem ayarlarına giderek hedef SDK sürümünden bağımsız olarak herhangi bir uygulama için tercih edilen konum doğruluğunu ayarlayabilir. 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
isteğinde bulunduğunda gösterilen sistem izinleri iletişim kutusu.ACCESS_FINE_LOCATION
hem de ACCESS_COARSE_LOCATION
iznini istediğinde gösterilen sistem izinleri iletişim kutusu.
Kullanıcı tercihi, izin verilmesini etkiler
Aşağıdaki tabloda, kullanıcının izin çalışma zamanı 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 izinleri yok | Konum izinleri yok |
Sistemin uygulamanıza hangi izinleri verdiğini belirlemek için izin isteğinizin dönüş değerini kontrol edin. Aşağıdakine benzer kodlarda Jetpack kitaplıklarını kullanabilir veya izin isteği kodunu kendinizin yönettiği 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 erişimini yaklaşık konumdan tam konuma yükseltmesini isteyebilirsiniz. Ancak kullanıcıdan uygulamanızın erişimini hassas konuma yükseltmesini istemeden önce, uygulamanızın kullanım alanında bu hassasiyet düzeyinin kesinlikle gerekli olup olmadığını göz önünde bulundurun. Uygulamanızın bir cihazı Bluetooth veya Kablosuz ağ üzerinden yakındaki cihazlarla eşlemesi gerekiyorsa ACCESS_FINE_LOCATION
izni istemek yerine companion device pairing veya Bluetooth izinlerini kullanmayı düşünebilirsiniz.
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 ihtiyacı olduğunu açıklayın.
ACCESS_FINE_LOCATION
veACCESS_COARSE_LOCATION
izinlerini tekrar birlikte isteyin. Kullanıcı, sisteme uygulamanıza yaklaşık konum izni vermesi için izin verdiğinden 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 plan konumunu isteyin
Uygulamanızdaki birkaç özellik konum erişimi gerektirse bile, arka planda konum erişimi gerektiren özelliklerin sayısı muhtemelen daha azdır. Bu nedenle, uygulamanızın konum izinleri için artımlı isteklerde bulunması, önce ön planda konum erişimi, ardından arka planda konum erişimi istemesi önerilir. Artımlı istekler yaparak kullanıcılara daha fazla kontrol ve şeffaflık sunarsınız. Çünkü 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 üzere tasarlanmış bir uygulama örneği gösterilmektedir. Hem "mevcut konumu göster" hem de "yakındaki yerleri öner" özellikleri için ön planda konum erişimi gerekir. 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 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şfederken arka planda konum erişimi isteğinde bulunabilirsiniz.
Ek kaynaklar
Android'deki konum izinleri hakkında daha fazla bilgi için aşağıdaki materyallere göz atın:
Codelab uygulamaları
Videolar
Örnekler
- Konum izinlerinin kullanımını gösteren örnek uygulama.