Çalışma zamanında konum erişimi iste

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ı Konum Paylaş düğmesini seçtikten sonra sistemin konum izni iletişim kutusu gösterilir.
1. şekil. Ön planda konum erişimi gerektiren konum paylaşımı özelliği. Kullanıcı Yalnızca uygulamayı kullanırken izin ver'i seçerse özellik etkinleştirilir.

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.

İletişim kutusu yalnızca yaklaşık konumu ifade eder ve üst üste 3 düğme içerir.
Şekil 2. Uygulamanız yalnızca ACCESS_COARSE_LOCATION isteğinde bulunduğunda gösterilen sistem izinleri iletişim kutusu.
İletişim kutusunda biri diğerinin üzerinde olmak üzere 2 grup seçenek bulunur.
3.şekil Uygulamanız tek bir çalışma zamanı isteğinde hem 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:

  1. Gerekirse uygulamanızın neden bu izne ihtiyacı olduğunu açıklayın.
  2. ACCESS_FINE_LOCATION ve ACCESS_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:
İletişim kutusunda &quot;Kesin konuma geç&quot;, &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot; seçenekleri bulunur.
Şekil 4. Kullanıcı daha önce Yaklaşık ve Uygulamayı kullanırken'i (Şekil 3'teki iletişim kutusunda) seçmiş olmalıdır.
İletişim kutusunda &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot; seçenekleri bulunur.
5. şekil. Kullanıcı daha önce Yaklaşık ve Yalnızca bu sefer'i (Şekil 3'teki iletişim kutusunda) seçmiş olmalıdır.

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.

Ön planda konum erişimini etkinleştiren düğme, arka planda konum erişimini etkinleştiren düğmeden yarım ekran uzaklıkta yer alıyor.
6.şekil Her iki özellik için de konum erişimi gerekir ancak yalnızca "yakındaki özellikleri öner" özelliği için arka planda konum erişimi gerekir.

Artımlı istek gerçekleştirme süreci aşağıdaki gibidir:

  1. 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.

  2. 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