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

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ı, Konum Paylaş düğmesini seçtikten sonra sistemin konum izni iletişim kutusu görünür
Şekil 1. Ö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ı 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.

İletişim kutusu yalnızca yaklaşık konumu ifade eder ve biri diğerinin üzerinde olmak üzere 3 düğme içerir
Şekil 2. Uygulamanız yalnızca ACCESS_COARSE_LOCATION isteğinde bulunduğunda görünen sistem izinleri iletişim kutusu.
İletişim kutusunda biri diğerinin üzerinde olmak üzere 2 seçenek grubu vardır.
Şekil 3. Uygulamanız tek bir çalışma zamanında istekte bulunarak hem ACCESS_FINE_LOCATION hem de ACCESS_COARSE_LOCATION isteğinde bulunduğunda görünen sistem izinleri iletişim kutusu.

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:

  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ı, 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:
İletişim kutusunda &quot;Tam konuma değiştir&quot;, &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot; seçenekleri bulunur.
Şekil 4. Kullanıcı daha önce Şekil 3'teki iletişim kutusunda Yaklaşık ve Uygulamayı kullanırken'i seçmiştir.
İletişim kutusunda &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot; seçenekleri bulunur.
Şekil 5. Kullanıcı daha önce Şekil 3'teki iletişim kutusunda Yaklaşık ve Yalnızca bu sefer'i seçmişti.

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.

Ön planda konum erişimini etkinleştiren düğme, arka planda konum erişimini etkinleştiren düğmeden yarım ekran uzunluğunda yerleştirilmiştir
Şekil 6. Her iki özellik de konum erişimi gerektirir ancak yalnızca "yakındaki özellikleri öner" özelliği arka planda konum erişimi gerektirir.

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

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

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