Konum izinleri isteyin

Kullanıcı gizliliğini korumak için, konum hizmetlerini kullanan uygulamalar konum isteğinde bulunmalıdır. izin verir.

Konum izni isterken diğer tüm çalışma zamanı izinleri için kullandığınız en iyi uygulamaları uygulayın. Konum izinleri konusundaki önemli farklardan biri de sistemimizde konumla ilgili birden fazla izin bulunuyor. İzin verdiğiniz izinler ve talep etme şekliniz, web sitenizin konum gereksinimlerine bağlıdır. kullanım alanına sahip olursunuz.

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ız yalnızca konum bilgilerini paylaşan veya alan bir özellik içeriyorsa bir defa veya belirli bir süre boyunca devam ediyorsa, bu özellik için konum erişimi. Buna örnek olarak aşağıdakiler verilebilir:

  • Navigasyon uygulamasındaki bir özellik, kullanıcıların adım adım yol tarifine yol tarifleri alın.
  • 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 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ı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, bir ön plan hizmeti beyan etmeniz önerilir. location değerini alır. Android 10 (API) sürümünde seviye 29) ve sonraki sürümler için 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 ACCESS_COARSE_LOCATION veya ACCESS_FINE_LOCATION iznini istediğinde aşağıdaki snippet'te gösterildiği gibi ö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 sürekli olarak Aile üyeleriyle konum paylaşmak.
  • 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 hassasiyeti: bağlı olan ön plan konum kesinliğiyle aynıdır. Uygulamanızın beyan ettiği konum izinleri.

Android 10 (API düzeyi 29) ve sonraki sürümlerde ACCESS_BACKGROUND_LOCATION uygulamanızın manifest dosyasında arka planda konum bilgisi isteme erişim çalışma zamanında somut olarak ortaya çıkar. 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ğrulukla 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, hangi konumdan bağımsız olarak yalnızca yaklaşık konuma erişebiliyor izin verdiğinizi gösterin.

Kullanıcı yalnızca yaklaşık konum izni verdiğinde uygulamanız çalışmaya devam etmelidir erişim. 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ışı, Aşağıdaki gibi çalışma zamanında istenen izinleri bağlam içinde isteme ile ilgili en iyi uygulama: uygulama talebinde bulunma işleminin nasıl yapıldığını açıklayan izinleriyle ilgili daha fazla bilgi edinin.

Şekil 1, bu işlemin nasıl gerçekleştirileceğine ilişkin bir örnek göstermektedir. Uygulama, "konumu paylaş" ön planda konuma erişim gerektiren bir özellik. Uygulama kullanıcı konum iznini istemediği sürece Konum paylaş düğmesi.

Kullanıcı, Konum Paylaş düğmesini seçtikten sonra sistemin konum izni iletişim kutusu görünür
Şekil 1. Konum paylaşımı özelliği ön planda konuma erişim. 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, hem ACCESS_FINE_LOCATION hem de ve ACCESS_COARSE_LOCATION isteği göndermelerine izin verir. 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 istediğinde sistem izinleri iletişim kutusunda, kullanıcıya ilişkin aşağıdaki seçenekler yer alır:

  • Tam: Uygulamanızın tam konum bilgisi 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 sistem ayarlarına gidebilir söz konusu uygulamanın konumundan bağımsız olarak, uygulama için tercih edilen konum doğruluğunu hedef SDK sürümü. 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 ifade eder ve biri diğerinin üzerinde olmak üzere 3 düğme içerir
Şekil 2. Aşağıdaki durumlarda görünen sistem izinleri iletişim kutusu Uygulamanız yalnızca ACCESS_COARSE_LOCATION isteğinde bulunuyor.
İ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
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 değerini döndürür. 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ınlardaki 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ı, sistem tarafından izin verilmesine bir gözüktüğünü varsayalım. Bu sefer sistem iletişim kutusu Şekil 4'te gösterilmiştir şekil 5:
İletişim kutusunda &#39;Tam olarak değiştir&#39; seçenekleri yer alır.
         konum&quot;, &quot;Yalnızca bu sefer&quot; ve &quot;Reddet&quot;.
Ş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; seçenekleri bulunur ve
         &quot;Reddet&quot;.
Ş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 plan konumunu iste

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ı e-tablo gibi ek yüklemelerle ilgili kabul edersiniz. Hem "mevcut konumu göster" hem de ve "yakındaki yerleri öner" ön planda konum erişimi gerektiriyor. Yalnızca "yakındaki yerleri öner" Ancak bu özellik 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ı istekler gerçekleştirme süreci aşağıdaki gibidir:

  1. Uygulamanız başta kullanıcıları, satın alma işlemi gerçekleştirmeleri için gereken "konumu paylaş" gibi ön planda konum erişimi Şekil 1'deki özellik veya "mevcut konumu göster" Şekil 2'deki bir özelliktir.

    Önerilen özellikler için kullanıcı erişimini devre dışı bırakmanız Uygulamanızın ön planda konumu olana kadar arka planda konum erişimi erişim.

  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, yüklü bir cihazda arka planda konum erişimi istediğinde Android 10 (API düzeyi 29), sistem izinleri iletişim kutusunda bir seçenek bulunur Her zaman izin ver olarak adlandırılmıştır. Kullanıcı bu seçeneği belirlerse, Uygulamanız arka planda konuma erişebilir.

Ancak Android 11 (API düzeyi 30) ve sonraki sürümlerde sistem iletişim kutusu Her zaman izin ver seçeneğini ekleyin. Bunun yerine, kullanıcıların konumu (Şekil 7'de gösterildiği gibi) seçin.

Arka planda konum izni isterken en iyi uygulamaları uygulayarak kullanıcıların bu ayarlar sayfasına gitmesine yardımcı olabilirsiniz. İzin süreci izni, 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 plana neden erişmesi gerektiğine dair net bir açıklama konum.
  • 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). Şu numarayı arayabilirsiniz: getBackgroundPermissionOptionLabel() ve bu etiketi almak için. 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 planı reddederse uygulamanızı kullanmaya devam edebilmeleri gerekir.
Kullanıcılar sistem bildirimine dokunarak konumu değiştirebilir
  bir uygulamanın ayarları
Şekil 8. Kullanıcıya bir uygulamaya arka planda konum erişimi.
'nı inceleyin.

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

Uygulamanızdaki bir özellik arka planda konum erişimi istediğinde kullanıcılar sistem iletişim kutusu. 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 isterse kullanıcının konum izinleri iletişim kutusundaki seçenekler arka planda konum için de geçerlidir. İçinde Yani kullanıcı, uygulamanıza ACCESS_BACKGROUND_LOCATION izni verirse izin verir ancak ön planda yalnızca yaklaşık konum erişimi verir. uygulaması 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 izni verdikten sonra ilk kez arka planda sistem, kullanıcıya gönderilmesi için bir bildirim planlar. Bu bildirim, uygulamanın cihaza erişmesine izin verdiğini hatırlatır konum verilerini sürekli olarak kullanmanızı sağlar. Şekil 8'de örnek bir bildirim gösterilmektedir.

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

Uygulamanızda konum izinlerine bağlı SDK'lar kullanılıp kullanılmadığını, özellikle de ACCESS_FINE_LOCATION izni. SDK bağımlılıklarınızın davranışlarını öğrenme hakkında Medium'daki bu makaleyi inceleyin.

Ek kaynaklar

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

Codelab uygulamaları

Videolar

Örnekler