Konum izinleri isteyin

Kullanıcı gizliliğini korumak için, konum hizmetlerini kullanan uygulamalar konum izinleri istemelidir.

Konum izinleri istediğinizde diğer çalışma zamanı izinleri için en iyi uygulamaları izleyin. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri ve nasıl talep edeceğiniz, uygulamanızın kullanım alanıyla ilgili konum gereksinimlerine bağlıdır.

Bu sayfada, konumla ilgili farklı gereksinimler açıklanmakta ve her durumda konum izninin nasıl isteneceği konusunda rehberlik sağlanmaktadır.

Konum erişimi türleri

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

Ön plan konumu

Uygulamanız, konum bilgilerini yalnızca bir kez veya belirli bir süre boyunca paylaşan ya da alan bir özellik içeriyorsa bu özellik ön planda konum erişimi gerektirir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:

  • Bir navigasyon uygulamasında bulunan bir özellik, kullanıcıların adım adım yol tarifi almasına olanak tanıyor.
  • Bir mesajlaşma uygulamasındaki bir özellik, kullanıcıların geçerli 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 bir etkinlik 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 (ör. 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 ön plan hizmet türünü location olarak bildirmeniz önerilir. Android 10 (API düzeyi 29) ve sonraki sürümlerde bu ön plan hizmet türünü belirtmeniz 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>
    

Aşağıdaki snippet'te gösterildiği gibi uygulamanız ACCESS_COARSE_LOCATION izni 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

Uygulamanın içindeki bir özellik sürekli olarak diğer kullanıcılarla konum bilgisi paylaşıyorsa veya Geofencing API'yi kullanıyorsa uygulama arka planda konum erişimi gerektirir. Aşağıda konuyla ilgili birkaç örnek verilmiştir:

  • Aile konum paylaşımı uygulamasında bulunan bir özellik, kullanıcıların sürekli olarak aile üyeleriyle konum paylaşmasına olanak tanır.
  • Bir IoT uygulamasında bulunan bir özellik, kullanıcıların ev cihazlarını yapılandırabilmelerini sağlar. Böylece kullanıcı evden çıktığında kapanır ve kullanıcı eve döndüğünde tekrar açılır.

Sistem, ön plan konumu bölümünde açıklananlar dışında herhangi bir durumda cihazın mevcut konumuna erişen uygulamanızı arka planda konum bilgisi kullanıyor olarak kabul eder. Arka planda konum hassasiyeti, uygulamanızın beyan ettiği konum izinlerine bağlı olan ön plan konum hassasiyeti ile aynıdır.

Android 10 (API düzeyi 29) ve sonraki sürümlerde, çalışma zamanında arka planda konum erişimi isteğinde bulunmak 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şimini de alır.

<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 üzerinden alınıyorsa bu tahmin yaklaşık 3 kilometrekare (yaklaşık 1,2 milkare) doğru olabilir. ACCESS_COARSE_LOCATION iznini beyan ettiğinizde, ancak ACCESS_FINE_LOCATION iznini beyan etmediğinizde uygulamanız konumları bu doğruluk düzeyinde alabilir.
Tam
Olabildiğince doğru bir cihaz konumu tahmini sağlar. Konum tahmini LocationManagerService veya FusedLocationProvider aralığındaysa bu tahmin genellikle yaklaşık 50 metre (160 fit) dahilinde ve bazen birkaç metre ya da daha iyi doğrulukta olabilir. ACCESS_FINE_LOCATION iznini beyan ettiğinizde uygulamanız bu doğruluk düzeyindeki konumları alabilir.

Kullanıcı yaklaşık konum izni verirse uygulamanız, 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 edecektir. Uygulamanızdaki bir özellik, ACCESS_FINE_LOCATION iznini kullanarak mutlaka tam konuma 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 özellik için konum erişimi gerektiğinde izin isteğinde bulunmadan önce kullanıcının özellikle etkileşimde bulunmasını bekleyin. Bu iş akışı, uygulama izinlerinin nasıl isteneceğini açıklayan kılavuzda da açıklandığı gibi, çalışma zamanı izinlerini bağlam içinde isteme ile ilgili en iyi uygulamayı izler.

Şekil 1'de, bu işlemin nasıl gerçekleştirileceğine ilişkin bir örnek gösterilmektedir. Uygulama, ön planda konum erişimi gerektiren bir "konum paylaş" özelliği içeriyor. Ancak uygulama, kullanıcı Konum 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üntülenir.
Ş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 verebilir

Android 12 (API düzeyi 31) veya sonraki sürümlerde kullanıcılar, uygulamanız ACCESS_FINE_LOCATION çalışma zamanı izni istese bile uygulamanızın yalnızca yaklaşık konum bilgilerini almasını isteyebilir.

Bu potansiyel kullanıcı davranışını işlemek için ACCESS_FINE_LOCATION iznini tek başına talep etmeyin. 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 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ı 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 kutusu, kullanıcı için aşağıdaki seçenekleri içerir:

  • Kesin: Uygulamanızın tam konum bilgileri 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 amacıyla her iki seçenek için görsel bir işaret bulunduğunu gösterilmiştir. Kullanıcı konum doğruluğuna karar verdikten sonra üç düğmeden birine dokunarak izin verme süresini seçer.

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 önceki sürümleri çalıştıran bir cihaza yüklenmiş olsa da kullanıcı cihazı Android 12 veya sonraki bir sürüme yükseltse bile geçerlidir.

İletişim kutusu yalnızca yaklaşık konumu belirtir ve biri diğerinin üzerinde olan 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 üstünde olan 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 izin vermelerini etkiler

Aşağıdaki tabloda, kullanıcının izin çalışma zamanı iletişim kutusunda belirlediği seçeneklere bağlı olarak sistem tarafından uygulamanıza verilen izinler gösterilmektedir:

Tam Yaklaşık
Uygulamayı kullanırken ACCESS_FINE_LOCATION ve
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
Yalnızca 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. Jetpack kitaplıklarını aşağıdakine benzer bir kodda kullanabilir veya izin isteği kodunu kendiniz yönetebileceğ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 erişimini tam konuma yükseltmesini istemeden önce, uygulamanızın kullanım alanının mutlaka bu düzeyde 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 tamamlayıcı cihaz eşleme veya Bluetooth izinlerini kullanmayı düşünün.

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 izne ihtiyacı olduğunu açıklayın.
  2. ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION izinlerini birlikte tekrar isteyin. Kullanıcı, sistemin uygulamanıza yaklaşık konum vermesine zaten izin verdiği için sistem iletişim kutusu şekil 4 ve şekil 5'te gösterildiği gibi bu sefer 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 Yaklaşık ve Uygulamayı kullanırken'i seçmiştir (Ş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çmiştir (şekil 3'teki iletişim kutusunda).

Başlangıçta yalnızca ön planda konum iste

Uygulamanızın birçok özelliği konum erişimi gerektirse bile bu özelliklerin yalnızca bazıları büyük olasılıkla arka planda konum erişimine ihtiyaç duyar. Bu nedenle, uygulamanızın ön planda konum erişimi, ardından arka planda konum erişimi isteyen ek istekleri yerine getirmesi önerilir. Artımlı istekler gerçekleştirerek kullanıcılara daha fazla kontrol ve şeffaflık sağlarsınız. Bu sayede kullanıcılar, uygulamanızdaki hangi özelliklerin arka planda konum erişimine ihtiyacı olduğunu daha iyi anlayabilir.

Şekil 6'da artımlı istekleri karşılamak üzere tasarlanmış bir uygulama örneği gösterilmektedir. Hem "geçerli konumu göster" hem de "yakındaki yerleri öner" özellikleri ön planda konum erişimini gerektirir. Ancak yalnızca "yakındaki yerleri öner" özelliği arka planda konum erişimine ihtiyaç duyar.

Ön planda konum erişimini etkinleştiren düğme, arka planda konumu etkinleştiren düğmeden ekran uzunluğunun yarısı kadar uzağa yerleştirilmiş
Şekil 6. Her iki özellik de konum erişimi gerektirir ancak yalnızca "yakındaki özellikleri öner" özelliği için arka planda konum erişimi gerekir.

Ek istekleri gerçekleştirme süreci aşağıdaki gibidir:

  1. İlk olarak, uygulamanız kullanıcıları Şekil 1'deki "konumu paylaş" özelliği veya Şekil 2'deki "mevcut konumu göster" özelliği gibi ön planda konum erişimi gerektiren özelliklere 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. Kullanıcı daha sonra arka planda konuma erişim gerektiren işlevleri keşfederken arka planda konum erişimi isteyebilirsiniz.

Gerekirse arka planda konum isteğinde bulunma

Ş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 isteğinde bulunduğunda sistem izinleri iletişim kutusu Her zaman izin ver adlı bir seçenek içerir. Kullanıcı bu seçeneği belirlerse uygulamanızdaki özellik arka planda konuma erişim elde eder.

Ancak Android 11 (API düzeyi 30) ve sonraki sürümlerde sistem iletişim kutusu Her zaman izin ver seçeneğini içermez. 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. İzni verme süreci, uygulamanızın hedef SDK sürümüne bağlıdır.

Uygulama Android 11 veya sonraki bir sürümü hedefliyor

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

  • Uygulamanızın özelliğinin neden arka planda konuma 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() numarasını arayabilirsiniz. Bu yöntemin döndürülen değeri, kullanıcının cihaz dili tercihine göre yerelleştirilmiştir.
  • Kullanıcıların izni reddetmesi için bir seçenek. Kullanıcılar arka planda konuma erişimi reddederse uygulamanızı kullanmaya devam edebilirler.
Kullanıcılar bir uygulamanın konum ayarlarını değiştirmek için sistem bildirimine dokunabilir
Ş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 konuma erişim istediğinde kullanıcılar bir sistem iletişim kutusu görür. Bu iletişim kutusunda, bir ayarlar sayfasında uygulamanızın konum izni seçeneklerine gitme seçeneği bulunur.

Uygulamanız konum izni istemeyle ilgili en iyi uygulamaları zaten kullandığı sürece bu davranışı desteklemek için herhangi bir değişiklik yapmanız gerekmez.

Kullanıcı arka planda konumun 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 verir ancak ön planda yalnızca yaklaşık konum erişimi verirse uygulamanız da 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, kullanıcı arka planda konum erişimi izni verdikten sonra uygulamanızdaki bir özellik arka planda cihaz konumuna ilk kez eriştiğinde sistem, kullanıcıya gönderilecek bir bildirim planlar. Bu bildirim kullanıcıya, uygulamanızın cihaz konumuna erişmesine her zaman izin verdiğini hatırlatır. Örnek bir bildirim Şekil 8'de gösterilmiştir.

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

Uygulamanızın konum izinlerine bağlı SDK'lar (özellikle de ACCESS_FINE_LOCATION izni) kullanıp kullanmadığını kontrol edin. SDK bağımlılıklarınızın davranışlarını anlama hakkındaki bu Medium makalesini inceleyin.

Ek kaynaklar

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

Codelab uygulamaları

Videolar

Sana Özel