Konum izinleri isteyin

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

Konum izinleri istediğinizde diğer tüm çalışma zamanı izinlerini tercih ettiğiniz en iyi uygulamaları izleyin. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izne sahip olmasıdır. Hangi izinleri istediğiniz ve bunları nasıl isteyeceğiniz, uygulamanızın kullanım alanına ilişkin konum gereksinimlerine bağlıdır.

Bu sayfada, konumla ilgili farklı gereksinimler açıklanmakta ve her bir durumda konum izninin nasıl isteneceği konusunda yol gösterici bilgiler sağlanmaktadır.

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 bulunuyorsa bu özellik ön planda konuma erişim izni gerektirir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:

  • Bir navigasyon uygulamasındaki ö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 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 (ör. kullanıcı, cihazındaki Ana sayfa düğmesine bastığında veya cihazının ekranını kapattığında) erişmeye devam eder.

    Ayrıca, aşağıdaki kod snippet'inde gösterildiği gibi location ön plan hizmeti türünü bildirmeniz önerilir. Android 10 (API düzeyi 29) ve sonraki sürümlerde bu ön plan hizmet türünü bildirmeniz 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 veya ACCESS_FINE_LOCATION iznini 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 uygulama, içindeki bir özellik sürekli konumunu diğer kullanıcılarla paylaşıyorsa veya Geofencing API'yi kullanıyorsa arka planda konum erişimine ihtiyaç duyar. Aşağıda konuyla ilgili birkaç örnek verilmiştir:

  • Ailelere yönelik konum paylaşımı uygulamalarındaki bir özellik, kullanıcıların aile üyeleriyle sürekli olarak konum paylaşmasına olanak tanır.
  • Bir IoT uygulamasındaki ö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, uygulamanızın ön plan konumu bölümünde açıklananlar dışında bir durumda cihazın mevcut konumuna erişiyorsa uygulamanızı arka planda konum bilgisi kullanıyor olarak kabul eder. Arka planda konum hassasiyeti, ön plandaki konum hassasiyeti ile aynıdır. Bu hassasiyet, uygulamanızın beyan ettiği konum izinlerine bağlı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 eski sürümlerinde, uygulamanız ön planda konum erişimi aldığında arka planda konum erişimini de otomatik olarak 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 aralığından ise bu tahmin yaklaşık 3 kilometrekare (yaklaşık 1,2 mil) aralığında doğru olur. ACCESS_COARSE_LOCATION iznini beyan ettiğinizde uygulamanız bu doğruluk düzeyinde konum alabilir ancak ACCESS_FINE_LOCATION iznini bildirmez.
Tam
Olabildiğince doğru bir cihaz konumu tahmini sağlar. Konum tahmini LocationManagerService veya FusedLocationProvider aralığındaysa bu tahmin genellikle yaklaşık 50 metrelik bir mesafedir ve bazen birkaç metre ya da daha iyi doğru olabilmektedir. ACCESS_FINE_LOCATION iznini beyan ettiğinizde uygulamanız bu doğruluk seviyesinde konum alabilir.

Kullanıcı yaklaşık konum izni verirse uygulamanız, belirttiğ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 etmelidir. Uygulamanızdaki bir özellik, ACCESS_FINE_LOCATION iznini kullanarak kesinlikle 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 özelliğin konum erişimine ihtiyacı olduğunda izin isteğinde bulunmadan önce kullanıcı özellikle etkileşimde bulunana kadar bekleyin. Bu iş akışı, uygulama izinlerini nasıl isteyeceğinizi açıklayan kılavuzda da açıklandığı gibi, çalışma zamanı izinlerini bağlam içinde isteme şeklindeki 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 "konumu paylaş" özelliği içeriyor. Ancak kullanıcı Konumu paylaş düğmesini seçene kadar uygulama 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 uygulama kullanılı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 olası 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 iznini hem de ACCESS_COARSE_LOCATION iznini isteyin. Yalnızca ACCESS_FINE_LOCATION için istekte bulunmayı denerseniz 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:

  • Tam: 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, kullanıcının seçim yapmasına yardımcı olmak amacıyla iletişim kutusunda her iki seçenek için de görsel bir işaret olduğu gösterilmektedir. Kullanıcı, konumun doğruluğuna karar verdikten sonra üç düğmeden birine dokunarak izin verme süresini belirler.

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ş ve ardından 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 üstünde 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 üst üste 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 isteğinde bulunduğunda görünen sistem izinleri iletişim kutusu.

Kullanıcı seçimi, izinlerin verilmesini etkiler

Aşağıdaki tabloda, kullanıcının izin çalışma zamanı iletişim kutusunda belirlediği seçeneklere bağlı olarak 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ı 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 konumun yükseltilmesini isteyin

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 bu düzeyde kesinlik gerektirip gerektirmediğini değerlendirin. Uygulamanızın Bluetooth veya kablosuz ağ üzerinden yakındaki cihazlarla bir cihazı eşlemesi gerekiyorsa ACCESS_FINE_LOCATION iznini istemek yerine tamamlayıcı cihaz eşleme özelliğini 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 bu 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 bulunur.
Ş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 bunlardan yalnızca bazıları arka planda konum erişimine ihtiyaç duyabilir. Bu nedenle, uygulamanızın ön planda konum erişimi, ardından arka planda konum erişimi isteyerek konum izinleri için ek istekler gerçekleştirmesi ö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 ele almak ü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ş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 konumu etkinleştiren düğmenin yarım ekran uzunluğunun uzağına konumlandırılır
Ş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 şu şekildedir:

  1. Uygulamanız başlangıçta, Ş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 kullanıcıları 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 işlevleri keşfettiğinde arka planda konum erişimi isteyebilirsiniz.

Gerekirse arka planda konum bilgisi isteme

Şekil 7. Ayarlar sayfası, arka planda konum erişimine izin veren Her zaman izin ver adlı bir seçenek 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 kutusunda Her zaman izin ver adlı bir seçenek bulunur. Kullanıcı bu seçeneği belirlerse uygulamanızdaki özellik arka planda konum erişimine sahip olur.

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ın Şekil 7'de gösterildiği gibi bir ayarlar sayfasında arka planda konumu etkinleştirmesi gerekir.

Arka planda konum izni isterken en iyi uygulamalardan yararlanarak 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 bir eğitici kullanıcı arayüzü gösterin:

  • Uygulamanızın özelliklerinin 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 konum erişimi istediğinde kullanıcılar bir sistem iletişim kutusu görür. Bu iletişim kutusu, bir ayarlar sayfasında uygulamanızın konum izni seçeneklerine gitmenizi sağlayan bir seçenek içerir.

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 konum doğruluğunu etkileyebilir

Kullanıcı yaklaşık konum istiyorsa 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 izni verirse ancak ön planda yalnızca yaklaşık konum erişimi verirse uygulamanız arka planda da 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. Şekil 8'de örnek bir bildirim bulunmaktadır.

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

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

Ek kaynaklar

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

Codelab uygulamaları

Videolar

Numuneler