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 izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri istediğiniz ve bunları nasıl isteyeceğiniz, uygulamanızın kullanım alanıyla ilgili konum koşullarına bağlıdır.

Bu sayfada, farklı konum koşulları türleri açıklanmakta ve her durumda konum izinlerinin nasıl isteneceğiyle ilgili 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 özellik için ön planda konum erişimi gerekir. Buna örnek olarak aşağıdakiler verilebilir:

  • Bir navigasyon uygulamasında, kullanıcıların adım adım yol tarifi almasına olanak tanıyan bir özellik.
  • Bir mesajlaşma uygulamasında, kullanıcıların mevcut konumlarını başka bir kullanıcıyla paylaşmalarına olanak tanıyan bir özellik.

Uygulamanızın bir özelliği aşağıdaki durumlardan birinde cihazın mevcut konumuna erişirse sistem, uygulamanızın ön planda konum bilgisi kullandığını düşünür:

  • Uygulamanıza ait bir etkinlik görünür.
  • 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. Kullanıcı cihazındaki Ana Ekran düğmesine bastığında veya cihazının ekranını kapattığında uygulamanız arka plana yerleştirildiğinde erişimi korur.

    Ayrıca, aşağıdaki kod snippet'inde gösterildiği gibi location ön plan hizmet türü tanımlamanız önerilir. Android 10 (API düzeyi 29) ve sonraki sürümlerde bu ön plan hizmeti 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 iznini istediğinde ön planda konum izni gerektiğini beyan edersiniz:

<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

Uygulamadaki bir özellik sürekli olarak konumu diğer kullanıcılarla paylaşıyorsa veya Coğrafi sınırlama API'sini kullanıyorsa uygulamanın arka planda konum erişimi gerekir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:

  • Aile konum paylaşımı uygulamasındaki bir özellik, kullanıcıların konum bilgilerini aile üyeleriyle sürekli olarak paylaşmasına olanak tanır.
  • Bir IoT uygulamasındaki bir özellik, kullanıcıların ev cihazlarını, evden ayrıldıklarında kapanacak ve eve döndüklerinde tekrar açılacak şekilde yapılandırmasına olanak tanır.

Sistem, ön planda konum bölümünde açıklanan durumlar dışındaki herhangi bir durumda cihazın mevcut konumuna erişirse uygulamanızın arka planda konum bilgisi kullandığını düşünür. Arka planda konum doğruluğu, uygulamanızın beyan ettiği konum izinlerine bağlı olan ön planda konum doğruluğu 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 belirtmeniz 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 tarafından sağlanıyorsa yaklaşık 3 kilometrekare (yaklaşık 1,2 mil kare) içinde 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 konumu tahmini sağlar. Konum tahmini LocationManagerService veya FusedLocationProvider ise bu tahmin genellikle yaklaşık 50 metre (160 inç) içindedir ve bazen birkaç metre (3,3 inç) kadar doğrudur veya daha iyidir. ACCESS_FINE_LOCATION iznini bildirdiğinizde uygulamanız bu doğruluk düzeyinde konum 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 eder. Uygulamanızdaki bir özellik için ACCESS_FINE_LOCATION izni kullanılarak tam konuma erişilmesi kesinlikle gerekiyorsa kullanıcıdan uygulamanızın tam konuma erişmesine izin vermesini isteyebilirsiniz.

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

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 izinlerinin nasıl isteneceğini açıklayan kılavuzda açıklandığı gibi, çalışma zamanında izin isteğinde bulunmayla 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ı Konumu 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, 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 potansiyel kullanıcı davranışını ele almak için ACCESS_FINE_LOCATION izinini 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 isteğinde bulunmayı denerseniz sistem, Android 12'nin bazı sürümlerinde isteği yoksayar. Uygulamanız Android 12 veya sonraki bir sürümü 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 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ına olanak tanır.
  • Yaklaşık: Uygulamanızın yalnızca yaklaşık konum bilgilerini 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 daha yeni bir sürüme yükseltmesi durumunda bile 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 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ı 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, 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ü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 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 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şı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 zaten 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 sefer&quot; ve &quot;Reddet&quot; seçenekleri bulunur.
Ş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 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ştirilir.
Ş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 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 ö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 işlevleri keşfettiğinde arka planda konum erişimi isteğinde bulunabilirsiniz.

Gerekirse arka planda konum isteğinde bulunun

Şekil 7. Ayarlar sayfasında, arka planda konum erişimi sağlayan Her zaman izin ver adlı bir seçenek bulunur.

İ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 bilgisi istediğinde sistem izinleri iletişim kutusunda Her zaman izin ver adlı bir seçenek yer alır. Kullanıcı bu seçeneği belirlerse uygulamanızdaki özellik arka planda konuma erişim kazanır.

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

Arka planda konum izni isterken en iyi uygulamaları uygulayarak 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ızın özelliğinin arka planda konum bilgisine 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ürdüğü değer, kullanıcının cihaz dili tercihine göre yerelleştirilir.
  • 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 konum erişimi 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ındaki uygulamanızın konum izni seçeneklerine gitme seçeneği bulunur.

Uygulamanız, konum izni istemeyle ilgili en iyi uygulamalara uyduğu sürece bu davranışı desteklemek için herhangi bir değişiklik yapmanız gerekmez.

Kullanıcı, arka plan konumunun doğruluğunu etkileyebilir

Kullanıcı yaklaşık konum bilgisi 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 iznine ancak ön planda yalnızca yaklaşık konum erişimi izni 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, uygulamanızdaki bir özellik kullanıcı arka planda konum erişimi verdikten sonra 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 her zaman erişmesine izin verdiğini hatırlatır. Şekil 8'de örnek bir bildirim gösterilmektedir.

Uygulamanızın SDK bağımlılıklarına ilişkin konum şartlarını kontrol etme

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ında Medium'daki bu makaleyi inceleyin.

Ek kaynaklar

Android'deki konum izinleri hakkında daha fazla bilgi için aşağıdaki materyalleri inceleyin:

Codelab uygulamaları

Videolar

Örnekler