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

Ç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ı, Konumu Paylaş düğmesini seçtikten sonra sistemin konum izni iletişim kutusu gösterilir.
Şekil 1. Ön planda konum erişimi gerektiren konum paylaşma özelliği. Kullanıcı Yalnızca uygulama kullanılı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ı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.

İletişim kutusu yalnızca yaklaşık konumu gösterir ve üst üste 3 düğme içerir.
Şekil 2. Uygulamanız yalnızca ACCESS_COARSE_LOCATION istediğinde 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ı isteğinde hem 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:

  1. Gerekirse uygulamanızın neden bu izne ihtiyaç duyduğ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ği için sistem iletişim kutusu bu kez farklıdır (Şekil 4 ve Şekil 5'te gösterildiği gibi):
İletişim kutusunda &quot;Tam konuma geç&quot;, &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot; seçenekleri yer alır.
Şekil 4. Kullanıcı daha önce Yaklaşık ve Uygulamayı kullanırken'i seçmiş (Şekil 3'teki iletişim kutusunda).
İletişim kutusunda &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot; seçenekleri bulunur.
Şekil 5. Kullanıcı daha önce Yaklaşık ve Yalnızca bu sefer'i seçmiş (Şekil 3'teki iletişim kutusunda).

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.

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

Artımlı istekleri 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ş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