Konum izinleri isteyin

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

Konum izni isterken diğer tüm çalışma zamanı izinleri için kullandığınız en iyi uygulamaları uygulayın. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri istediğiniz ve bunları nasıl istediğiniz, uygulamanızın kullanım alanı için konum koşullarına bağlıdır.

Bu sayfada, farklı konum şartı 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. Örneklerden bazıları şunlardır:

  • 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ının dikkatini çeker. 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. Örneklerden bazıları şunlardır:

  • Bir aile konum paylaşımı uygulamasında, kullanıcıların konumu aile üyeleriyle sürekli olarak paylaşmasına olanak tanıyan bir özellik.
  • 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 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 tarafından sağlanıyorsa yaklaşık 3 kilometrekare (yaklaşık 1,2 mil kare) içinde doğrudur. ACCESS_FINE_LOCATION iznini değil, ACCESS_COARSE_LOCATION iznini belirttiğinizde uygulamanız bu düzeyde doğrulukta konum 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 özellik için konum erişimi gerektiğinde, izin isteği göndermeden önce kullanıcının özellikle etkileşim kurması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ı, Konum 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 kullanıcılar, uygulamanız ACCESS_FINE_LOCATION kod çalışma zamanında izin istediğinde bile 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ında istek göndererek hem ACCESS_FINE_LOCATION izinini hem de ACCESS_COARSE_LOCATION izinini 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 izni istediğinde sistem izinleri iletişim kutusu kullanıcıya aşağıdaki seçenekleri sunar:

  • Tam: Uygulamanızın tam konum bilgisi almasına izin verir.
  • Yaklaşık: Uygulamanızın yalnızca yaklaşık konum bilgisi 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 sonraki 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ında istekte bulunarak 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, 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ü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

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 hassas konum erişimini yükseltmesini istemeden önce, uygulamanızın kullanım alanının bu düzeyde hassasiyet gerektirip gerektirmediğini düşünün. Uygulamanızın, bir cihazı Bluetooth veya kablosuz ağ üzerinden yakınındaki cihazlarla eşlemesi gerekiyorsa ACCESS_FINE_LOCATION iznini istemek yerine yardımcı cihaz eşleme veya Bluetooth izinlerini kullanabilirsiniz.

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 Şekil 3'teki iletişim kutusunda Yaklaşık ve Uygulamayı kullanırken'i seçmiştir.
İ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ştirilmiştir
Şekil 6. Her iki özellik de konum erişimi gerektirir ancak yalnızca "yakındaki özellikleri öner" özelliği arka planda konum erişimi gerektirir.

Artımlı istek 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 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 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 konum erişimi elde eder.

Ancak Android 11 (API düzeyi 30) ve sonraki sürümlerde sistem iletişim kutusunda Her zaman izin ver seçeneği yer almaz. 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ıza ACCESS_BACKGROUND_LOCATION izni verilmediyse ve shouldShowRequestPermissionRationale() true döndürüyorsa kullanıcılara aşağıdakileri içeren eğitici bir 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 ayar seçeneğinin kullanıcı tarafından görülebilen etiketi (örneğin, şekil 7'deki 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 bir seçenek. Kullanıcılar arka planda konum erişimini 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 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 izni hatırlatıcısı

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'da yer alan 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