Konum izinleri isteyin

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

Konum izni isteğinde bulunurken sizinle aynı en iyi uygulamaları izleyin diğer tüm çalışma zamanı izinleri için kullanılır. 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ı türdeki konumlarla ilgili gereksinimler ve her durumda konum izni isteme konusunda yol gösterici bilgiler edinebilirsiniz.

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.
  • Mesajlaşma uygulamasındaki bir özellik, kullanıcıların mevcut konumlarını paylaşmalarına olanak tanır gerçekleştirebilirsiniz.

Sistem, uygulamanızın ön planda konumunu kullandığını varsayar: Uygulamanız cihazın mevcut konumuna aşağıdakilerden biri üzerinden erişiyorsa durumlar:

  • Uygulamanıza ait etkinlikler görünür durumda.
  • Uygulamanız bir ön plan hizmeti çalıştırıyor. Bir ön plan hizmeti sistem, sürekli bir bildirim göstererek kullanıcı farkındalığını artırır. Uygulamanız arka plana yerleştirildiğinde (örneğin, Kullanıcı cihazındaki Ana Sayfa düğmesine bastığında veya cihazının ekranını açtığında kapalı.

    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 izninin değerini değiştirin:

<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

Uygulama içindeki bir özellik varsa arka planda konuma erişmesi gereken uygulamalar konumunu diğer kullanıcılarla sürekli olarak paylaşır veya Coğrafi sınır belirleme API. Aşağıda çeşitli örnekler verilmiştir:

  • Aile konum paylaşımı uygulamasındaki bir özellik, kullanıcıların sürekli olarak Aile üyeleriyle konum paylaşmak.
  • IoT uygulamasındaki bir özellik, kullanıcıların ev cihazlarını bu ayarları, kullanıcı evden çıkarken kapanıyor ve kullanıcı ana ekrana döner.

Uygulamanız cihazın bulunduğu konumu, ön plan konumu bölümüne bakın. 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. Şu sürümün önceki sürümlerinde: Android, uygulamanız ön planda konuma otomatik olarak eriştiğinde arka planda konuma 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, bu tahmin, yaklaşık 3 kilometrekare (yaklaşık 1,2 kilometrekare) aralığında mil). Aşağıdakileri yaptığınızda uygulamanız bu doğruluk düzeyinde konumları alabilir: ACCESS_COARSE_LOCATION iznini beyan eder, ancak izin belirtmez ACCESS_FINE_LOCATION izni.
Tam
Mümkün olduğunca doğru bir cihaz konum tahmini sağlar. Öğe konum tahmini LocationManagerService veya FusedLocationProvider, bu tahmin genellikle yaklaşık 50 metre (160 fit) olur ve bazen en fazla birkaç metrelik hata payı bulunur. Uygulamanız aşağıdakileri alabilir konum bilgilerini ACCESS_FINE_LOCATION bildirdiğinizde bu doğruluk düzeyindeki izni gerekir.

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 özelliğin mutlaka tam konuma erişmesi gerekiyorsa ACCESS_FINE_LOCATION iznini kullanarak, kullanıcıdan uygulamasını kullanın.

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

Uygulamanızdaki bir özelliğin konum erişimine ihtiyacı olduğunda kullanıcı etkileşimde bulunana kadar bekleyin özellikle kontrol etmelisiniz. 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ı Konumu 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. Bu özellik, kullanıcı seçtiğinde etkinleştirilir Yalnızca uygulama kullanılırken izin ver.

Kullanıcı yalnızca yaklaşık konum izni verebilir

Android 12 (API düzeyi 31) veya sonraki sürümlerde kullanıcılar yalnızca yaklaşık konum bilgileri (uygulamanız şu bilgiyi istese bile) ACCESS_FINE_LOCATION çalışma zamanında istenen izne tabi değildir.

Bu olası kullanıcı davranışını işlemek için ACCESS_FINE_LOCATION isteğinde bulunmayın kabul etmesi gerekir. Bunun yerine, hem ACCESS_FINE_LOCATION hem de ve ACCESS_COARSE_LOCATION isteği göndermelerine izin verir. Yalnızca ACCESS_FINE_LOCATION, sistem bazı sürümlerde isteği yoksayar Android 12. Uygulamanız Android 12 veya sistem aşağıdaki hata mesajını Logcat:

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 bilgilerini almasını sağlar.
  • Yaklaşık: Uygulamanızın yalnızca yaklaşık konum bilgilerini almasına izin verir.

Şekil 3, iletişim kutusunun görsel bir resim kullanıcının seçim yapmasına yardımcı olmak için her iki seçenekte de işaretler vardır. Kullanıcı bir üç düğmeden birine dokunarak düğmenin süresini seçmek için hakkında bilgi edindiniz.

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ü. Uygulamanız bir cihazda yüklü olsa bile bu geçerlidir Android 11 veya önceki bir sürümü çalıştırıyorsa ve ardından kullanıcı Android 12 veya sonraki bir sürüme güncelleyin.

İletişim kutusu yalnızca yaklaşık konumu 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 bulunur
Şekil 3. Aşağıdaki durumlarda görünen sistem izinleri iletişim kutusu Uygulamanız hem ACCESS_FINE_LOCATION hem de Tek bir çalışma zamanı isteğinde ACCESS_COARSE_LOCATION.

Kullanıcı seçimi, verilen izinleri etkiler

Aşağıdaki tabloda sistemin uygulamanıza verdiği izinler gösterilir, kullanıcının izinlerin çalışma zamanı iletişim kutusunda seçtiği seçeneklere göre:

Tam Yaklaşık
Uygulamayı kullanırken ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
Yalnız bu sefer ACCESS_FINE_LOCATION
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. Jetpack kitaplıklarını kodda kullanabilirsiniz benzer kitaplıklar kullanabilirsiniz. Kitaplıktaki izin istek kodunu yönetme kendiniz.

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 yenisine geçirmesini isteyebilirsiniz tam konum. Kullanıcıdan uygulamanızın erişimini Ancak, uygulamanızın kullanım alanının kesinlikle bu hassasiyet seviyesini gerektirir. Uygulamanızın bir cihazı yakındaki cihazlarla eşlemesi gerekiyorsa cihaz kullanıyorsanız tamamlayıcı cihaz kullanmayı düşünün eşleme veya Bluetooth yerine ACCESS_FINE_LOCATION izni isteniyor.

Kullanıcıdan, uygulamanızın konum erişimini yaklaşık olarak yerine geçirmesini istemek için aşağıdakileri yapın:

  1. Gerekirse uygulamanızın izni gerekir.
  2. ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION izinlerini iste izleyebilirsiniz. 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. Daha önce kullanıcı Yaklaşık ve Uygulamayı kullanırken'i seçin (iletişim kutusunda Şekil 3'teki gibi)
İletişim kutusunda &quot;Yalnızca bu sefer&quot; seçenekleri bulunur ve
         &quot;Reddet&quot;.
Şekil 5. Daha önce kullanıcı Yaklaşık ve Yalnızca bu sefer seçilidir ( şekil 3).

Başlangıçta yalnızca ön plan konumunu iste

Uygulamanızdaki bazı özellikler konum erişimi gerektirse bile, uygulamalarınızın Ancak bunlardan yalnızca bazıları arka planda konum erişimi gerektirir. Dolayısıyla, Uygulamanızın konum için artımlı istekler gerçekleştirmesini önerdi ön planda konum erişimi ve ardından arka planda konum izni isteyerek erişim. Artımlı istekler gerçekleştirerek kullanıcılarınıza daha fazla kontrol daha iyi anlamalarını sağlar. Bu sayede, uygulamanızda hangi özelliklerin arka planda konum erişimi.

Ş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 konuma erişimi sağlayan düğme
    düğmeden yarım ekran uzağa konumlandırıldı.
    konum
Şekil 6. Her iki özellik de konum erişimi gerektirir, ancak "yakındaki özellikleri öner" Bu özellik arka planda konum gerektirir erişebilir.

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ı başka bir uygulama için gereken konum erişimine sahip kullanıcılar için arka planda konum isteme erişim.

Gerekirse arka planda konum bilgisini iste

Şekil 7. Ayarlar sayfasında, Her zaman izin ver: Arka planda konum izni verir erişebilir.

İzin iletişim kutusu içeriği, hedef SDK sürümüne bağlıdır

Uygulamanızdaki bir özellik, çalışan 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.

En iyi uygulamaları izleyerek kullanıcıların bu ayarlar sayfasına gitmesine yardımcı olabilirsiniz. arka planda konum izni istenir. İ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 değerini döndürür, kullanıcılara aşağıdakileri içeren bir eğitim amaçlı kullanıcı arayüzü gösterir:

  • 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ürülen değeri, kullanıcının cihaz dil tercihini belirtin.
  • Kullanıcıların izni reddetmesi için sunulan 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, uygulamanızın konumuna gitmek için kullanabileceğiniz bir seçenek bulunur ayarları sayfasında görebilirsiniz.

Uygulamanız konum istemeyle ilgili en iyi uygulamaları takip ettiği 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 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 izniyle ilgili hatırlatma

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. Medium hakkındaki bu makaleye göz atın SDK'nızın davranışlarını öğrenme hakkında bağımlılıklarını görebilirsiniz.

Ek kaynaklar

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

Codelab'ler

Videolar

Örnekler