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:
- Kategori: Ön planda konum veya arka planda konum.
- Doğruluk: Tam konum veya yaklaşık konum.
Ö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
veyaFusedLocationProvider
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
veyaFusedLocationProvider
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ı 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.
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:
- Gerekirse uygulamanızın neden bu izne ihtiyacı olduğunu açıklayın.
ACCESS_FINE_LOCATION
veACCESS_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:
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.
Artımlı istekler gerçekleştirme süreci aşağıdaki gibidir:
-
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.
-
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
İ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.
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
- Konum izinlerinin kullanımını gösteren örnek uygulama.