Konum izinleri isteyin

Kullanıcı gizliliğini korumak için konum hizmetlerini kullanan uygulamaların konum izinleri istemesi gerekir.

Konum izni isterken diğer çalışma zamanı izinlerinde yararlandığınız en iyi uygulamaları izleyin. Konum izinleri konusundaki önemli farklardan biri, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri istediğiniz ve bunları nasıl istediğiniz, uygulamanızın kullanım alanıyla ilgili konum koşullarına bağlıdır.

Bu sayfada, farklı konum gereksinimleri türleri açıklanmakta ve her durumda konum izni isteme hakkında yol gösterici bilgiler verilmektedir.

Konum erişimi türleri

Her izin, aşağıdaki özelliklerin bir kombinasyonuna sahiptir:

Ön plan konumu

Uygulamanızda konum bilgilerini yalnızca bir kez veya belirli bir süre boyunca paylaşan ya da alan bir özellik varsa bu özelliğin ön planda konum erişimine ihtiyacı vardır. Buna örnek olarak aşağıdakiler verilebilir:

  • Navigasyon uygulamasındaki bir özellik, kullanıcıların adım adım yol tarifi almasına olanak tanır.
  • Mesajlaşma uygulamasındaki bir özellik, kullanıcıların mevcut konumlarını başka bir kullanıcıyla paylaşmasına olanak tanır.

Uygulamanızın bir özelliği, aşağıdaki durumlardan birinde cihazın mevcut konumuna erişirse sistem, uygulamanızı ön plan konumunu kullanıyor olarak kabul eder:

  • Uygulamanıza ait etkinlikler görünür durumda.
  • Uygulamanız bir ön plan hizmeti çalıştırıyor. Bir ön plan hizmeti çalışırken sistem, kalıcı bir bildirim göstererek kullanıcı farkındalığını artırır. Uygulamanız arka plana yerleştirildiğinde (örneğin, kullanıcı cihazındaki Ana Sayfa düğmesine bastığında veya cihazının ekranını kapattığında) erişimi korur.

    Ayrıca, aşağıdaki kod snippet'inde gösterildiği gibi location için bir ön plan hizmet türünü belirtmeniz önerilir. Android 10 (API düzeyi 29) ve sonraki sürümlerde bu ön plan hizmet türünü beyan etmeniz gerekir.

    <!-- Recommended for Android 9 (API level 28) and lower. -->
    <!-- Required for Android 10 (API level 29) and higher. -->
    <service
        android:name="MyNavigationService"
        android:foregroundServiceType="location" ... >
        <!-- Any inner elements would go here. -->
    </service>
    

Uygulamanız, aşağıdaki snippet'te gösterildiği gibi ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION izni istediğinde ön planda konum ihtiyacını beyan etmiş olursunuz:

<manifest ... >
  <!-- Always include this permission -->
  <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

  <!-- Include only if your app benefits from precise location access. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Arka planda konum

Bir uygulamadaki bir özellik, diğer kullanıcılarla sürekli olarak konum bilgisini paylaşıyorsa veya Geofencing API'yi kullanıyorsa arka planda konum erişimi gerekir. Aşağıda çeşitli örnekler verilmiştir:

  • Aile konum paylaşımı uygulamasındaki bir özellik, kullanıcıların konum bilgisini aile üyeleriyle sürekli olarak paylaşmasına olanak tanır.
  • IoT uygulamasındaki bir özellik, kullanıcıların ev cihazlarını, kullanıcı evden çıktığında kapanacak ve eve döndüğünde tekrar açacak şekilde yapılandırmasına olanak tanır.

Uygulamanız, ön plan konum bölümünde açıklananlar dışında herhangi bir durumda cihazınızın mevcut konumuna erişirse sistem, uygulamanızın arka planda konumu kullanıyor olduğunu kabul eder. Arka planda konum hassasiyeti, uygulamanızın beyan ettiği konum izinlerine bağlı olan ön plan konum kesinliğiyle aynıdır.

Android 10 (API düzeyi 29) ve sonraki sürümlerde, çalışma zamanında arka planda konum erişimi istemek için uygulamanızın manifest dosyasında ACCESS_BACKGROUND_LOCATION iznini beyan etmeniz gerekir. Android'in önceki sürümlerinde, uygulamanız ön planda konum erişimi aldığında otomatik olarak arka planda konum erişimi de elde eder.

<manifest ... >
  <!-- Required only when requesting background location access on
       Android 10 (API level 29) and higher. -->
  <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>

Doğruluk

Android, aşağıdaki konum doğruluğu düzeylerini destekler:

Yaklaşık
Cihaz konumu tahmini sağlar. Bu konum tahmini LocationManagerService veya FusedLocationProvider kaynaklıysa bu tahmin yaklaşık 3 kilometrekare (yaklaşık 1,2 milkare) için doğrudur. ACCESS_COARSE_LOCATION iznini beyan edip ACCESS_FINE_LOCATION iznini beyan ettiğinizde uygulamanız bu doğruluk düzeyinde konumları alabilir.
Tam
Mümkün olduğunca doğru bir cihaz konum tahmini sağlar. Konum tahmini LocationManagerService veya FusedLocationProvider kaynaklıysa bu tahmin genellikle yaklaşık 50 metrelik bir alan içinde olur ve bazen birkaç metrelik alan dahilinde veya daha iyi bir alan adı kadar doğru olabilir. ACCESS_FINE_LOCATION iznini beyan ettiğinizde uygulamanız bu doğruluk düzeyinde konumları alabilir.

Kullanıcı yaklaşık konum izni verirse uygulamanızın beyan ettiği konum izinlerinden bağımsız olarak yalnızca yaklaşık konuma erişebilir.

Kullanıcı yalnızca yaklaşık konum erişimi verdiğinde uygulamanız çalışmaya devam eder. Uygulamanızdaki bir özellik, ACCESS_FINE_LOCATION iznini kullanarak tam konuma mutlaka erişim gerektiriyorsa kullanıcıdan uygulamanızın tam konuma erişmesine izin vermesini isteyebilirsiniz.

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

Uygulamanızdaki bir özelliğin konum erişimine ihtiyacı olduğunda, izin isteğinde bulunmadan önce kullanıcının özellikle etkileşimde bulunmasını bekleyin. Bu iş akışı, uygulama izni isteme işleminin nasıl yapıldığını açıklayan kılavuzda açıklandığı gibi, bağlam içinde çalışma zamanında istenen izin isteme ile ilgili en iyi uygulamaya denk gelir.

Şekil 1, bu işlemin nasıl gerçekleştirileceğine ilişkin bir örnek göstermektedir. Uygulama, ön planda konum erişimi gerektiren bir "konum paylaşma" özelliği içeriyor. 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örünür.
Şekil 1. Ön planda konuma erişim gerektiren konum paylaşımı ö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, uygulamanız ACCESS_FINE_LOCATION çalışma zamanı izni istese bile kullanıcılar uygulamanızın yalnızca yaklaşık konum bilgilerini almasını isteyebilir.

Bu olası kullanıcı davranışını işlemek için ACCESS_FINE_LOCATION iznini tek başına istemeyin. Bunun yerine, tek bir çalışma zamanı isteğinde hem ACCESS_FINE_LOCATION hem de ACCESS_COARSE_LOCATION iznini isteyin. Yalnızca ACCESS_FINE_LOCATION için istekte bulunursanız sistem, Android 12'nin bazı sürümlerinde bu 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 isteğinde bulunduğunda, 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ını sağlar.
  • 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 amacıyla her iki seçenek için de bir görsel işaret bulunduğu gösterilmektedir. Kullanıcı konum doğruluğuna karar verdikten sonra üç düğmeden birine dokunarak izin verme süresini seçebilir.

Android 12 ve sonraki sürümlerde kullanıcılar sistem ayarlarına giderek uygulamanın hedef SDK sürümünden bağımsız olarak herhangi bir uygulama için tercih edilen konum doğruluğunu ayarlayabilir. Uygulamanız Android 11 veya önceki sürümleri çalıştıran bir cihaza yüklendiğinde kullanıcı cihazı Android 12 veya sonraki bir sürüme yükselttiğinde bile bu durum geçerlidir.

İletişim kutusu yalnızca yaklaşık konumu belirtir ve biri diğerinin üzerinde olmak üzere 3 düğme içerir
Şekil 2. Uygulamanız yalnızca ACCESS_COARSE_LOCATION istediğinde görüntülenen sistem izinleri iletişim kutusu.
İletişim kutusunda biri diğerinin üzerinde olmak üzere 2 seçenek grubu bulunur
Şekil 3. Uygulamanız tek bir çalışma zamanı isteğinde hem ACCESS_FINE_LOCATION hem de ACCESS_COARSE_LOCATION istediğinde görüntülenen sistem izinleri iletişim kutusu.

Kullanıcı seçimi, verilen izinleri 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 izni yok Konum izni yok

Sistemin uygulamanıza hangi izinleri verdiğini belirlemek için izin isteğinizin döndürüldüğü değeri kontrol edin. Jetpack kitaplıklarını aşağıdakine benzer bir kodda kullanabilir veya izin isteği kodunu kendiniz yönettiğiniz platform kitaplıklarını kullanabilirsiniz.

Kotlin

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.
locationPermissionRequest.launch(arrayOf(
    Manifest.permission.ACCESS_FINE_LOCATION,
    Manifest.permission.ACCESS_COARSE_LOCATION))

Java

ActivityResultLauncher<String[]> locationPermissionRequest =
    registerForActivityResult(new ActivityResultContracts
        .RequestMultiplePermissions(), result -> {
            Boolean fineLocationGranted = result.getOrDefault(
                    Manifest.permission.ACCESS_FINE_LOCATION, false);
            Boolean 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 bulunun

Kullanıcıdan uygulamanızın erişimini yaklaşık konumdan tam konuma 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 mutlaka bu hassasiyet düzeyini gerektirip gerektirmediğini düşünün. Uygulamanızın, Bluetooth veya kablosuz ağ üzerinden yakındaki cihazlarla bir cihazı eşlemesi gerekiyorsa ACCESS_FINE_LOCATION izni istemek yerine tamamlayıcı cihaz eşleme veya Bluetooth izinlerini kullanmayı düşünün.

Kullanıcıdan uygulamanızın konum erişimini yaklaşık olarak tam konum ayarına yükseltmesini istemek için aşağıdakileri yapın:

  1. Gerekirse uygulamanızın neden izne ihtiyacı olduğunu açıklayın.
  2. ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION izinlerini tekrar birlikte isteyin. Kullanıcı zaten sistemin uygulamanıza yaklaşık konum izni vermesine izin verdiğinden, sistem iletişim kutusu bu kez ş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 kez&quot; ve &quot;Reddet&quot; seçenekleri yer alır.
Şekil 4. Kullanıcı daha önce Yaklaşık ve Uygulamayı kullanırken'i seçti (Şekil 3'teki iletişim kutusunda).
İletişim kutusunda &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot; seçenekleri yer alır.
Şekil 5. Kullanıcı daha önce Yaklaşık ve Yalnızca bu sefer'i seçti (Şekil 3'teki iletişim kutusunda).

Başlangıçta yalnızca ön plan konumunu iste

Uygulamanızdaki bazı özellikler konum erişimi gerektirse bile, büyük olasılıkla bu özelliklerin yalnızca bazıları arka planda konuma erişimi gerektiriyordur. Bu nedenle, uygulamanızın konum izinleri için artımlı istekler gerçekleştirerek ön planda konum erişimini ve ardından arka planda konum erişimini istemesi önerilir. Artan istekler gerçekleştirdiğinizde, 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 ihtiyacı olduğunu daha iyi anlayabilir.

Ş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 konuma erişimi etkinleştiren düğme, arka planda konumu etkinleştiren düğmeden yarım ekran uzaklığa yerleştirilmiştir
Şekil 6. Her iki özellik de konum erişimi gerektirir ancak yalnızca "yakındaki özellikleri öner" özelliği için arka planda konuma erişim izni gerekir.

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

  1. Uygulamanız ilk olarak, kullanıcıları ön planda konuma erişim gerektiren özelliklere (Şekil 1'deki "konumu paylaş" özelliği veya Şekil 2'deki "geçerli konumu göster" gibi) yönlendirmelidir.

    Uygulamanızın ön planda konuma erişimi 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 bir işlevi keşfettiğinde arka planda konuma erişim isteğinde bulunabilirsiniz.

Gerekirse arka planda konum bilgisini iste

Şekil 7. Ayarlar sayfası, arka planda konuma erişim izni veren Her zaman izin ver seçeneğini içerir.

İzin iletişim kutusu içeriği, hedef SDK sürümüne bağlıdır

Uygulamanızdaki bir özellik, Android 10 (API düzeyi 29) çalıştıran bir cihazda arka planda konum istediğinde, sistem izinleri iletişim kutusunda Her zaman izin ver adlı bir seçenek bulunur. Kullanıcı bu seçeneği belirlerse uygulamanızdaki özellik arka planda konuma erişir.

Ancak Android 11 (API düzeyi 30) ve sonraki sürümlerde sistem iletişim kutusunda Her zaman izin ver seçeneği bulunmaz. Bunun yerine, kullanıcılar Şekil 7'de gösterildiği gibi bir ayarlar sayfasında arka planda konumu etkinleştirmelidir.

Arka planda konum izni isterken en iyi uygulamaları izleyerek kullanıcıların bu ayarlar sayfasına gitmesine yardımcı olabilirsiniz. İzin verme süreci, uygulamanızın hedef SDK sürümüne bağlıdır.

Uygulama Android 11 veya sonraki sürümleri hedefliyor

Uygulamanız için ACCESS_BACKGROUND_LOCATION izni verilmediyse ve shouldShowRequestPermissionRationale(), true değerini döndürürse kullanıcılara aşağıdakileri içeren bir eğitim kullanıcı arayüzü gösterin:

  • Uygulamanızdaki özelliğin arka planda konuma neden erişmesi gerektiğine dair net bir açıklama.
  • Arka planda konum izni veren ayarlar seçeneğinin kullanıcı tarafından görülebilen etiketi (örneğin, Şekil 7'de Her zaman izin ver). Bu etiketi almak için getBackgroundPermissionOptionLabel() numaralı telefonu arayabilirsiniz. Bu yöntemin döndürülen değeri, kullanıcının cihaz dil tercihine göre belirlenir.
  • Kullanıcıların izni reddetmesi için sunulan bir seçenek. Kullanıcılar arka planda konum erişimini reddederse uygulamanızı kullanmaya devam edebilirler.
Kullanıcılar sistem bildirimine dokunarak uygulamanın konum ayarlarını değiştirebilirler
Şekil 8. Kullanıcıya bir uygulamaya arka planda konuma erişim izni verdiğini hatırlatan bildirim.

Uygulama Android 10 veya önceki sürümleri hedefliyor

Uygulamanızdaki bir özellik arka planda konum erişimi istediğinde kullanıcılara bir sistem iletişim kutusu gösterilir. Bu iletişim kutusunda, ayarlar sayfasında uygulamanızın konum izni seçeneklerine gitme seçeneği bulunur.

Uygulamanız konum izni istemeyle ilgili en iyi uygulamaları takip ettiği sürece bu davranışı destekleyecek herhangi bir değişiklik yapmanız gerekmez.

Kullanıcı arka planda konum doğruluğunu etkileyebilir

Kullanıcı yaklaşık konum isterse kullanıcının konum izinleri iletişim kutusundaki seçimleri arka planda konum için de geçerli olur. Diğer bir deyişle, kullanıcı uygulamanıza ACCESS_BACKGROUND_LOCATION iznini verirse ancak ön planda yalnızca yaklaşık konum erişimi verirse uygulamanız arka planda yalnızca yaklaşık konum erişimine sahip olur.

Arka planda konum izniyle ilgili hatırlatma

Android 10 ve sonraki sürümlerde uygulamanızdaki bir özellik kullanıcı arka planda konuma erişim izni verdikten sonra arka planda cihaz konumuna ilk kez eriştiğinde sistem, kullanıcıya göndermek için bir bildirim planlar. Bu bildirim, kullanıcıya uygulamanızın cihaz konumuna sürekli olarak erişmesine izin verdiğini hatırlatır. Şekil 8'de örnek bir bildirim gösterilmektedir.

Uygulamanızın SDK bağımlılıklarında konum gereksinimlerini kontrol edin

Uygulamanızın, özellikle ACCESS_FINE_LOCATION izni olmak üzere konum izinlerine bağlı SDK'lar kullanıp kullanmadığını kontrol edin. SDK bağımlılıklarınızın davranışlarını öğrenme hakkındaki bu Medium makalesine göz atın.

Ek kaynaklar

Android'de konum izinleri hakkında daha fazla bilgi için aşağıdaki materyalleri görüntüleyin:

Codelab'ler

Videolar

Numuneler