Kullanıcı gizliliğini korumak için, konum hizmetlerini kullanan uygulamalar konum izinleri istemelidir.
Konum izinleri istediğinizde diğer çalışma zamanı izinleri için en iyi uygulamaları izleyin. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri ve nasıl talep edeceğiniz, uygulamanızın kullanım alanıyla ilgili konum gereksinimlerine bağlıdır.
Bu sayfada, konumla ilgili farklı gereksinimler açıklanmakta ve her durumda konum izninin nasıl isteneceği konusunda rehberlik sağlanmaktadır.
Konum erişimi türleri
Her izin aşağıdaki özelliklerin bir kombinasyonuna sahiptir:
- Kategori: Ön plan konumu veya arka plan konumu.
- Doğruluk: Tam konum veya yaklaşık konum.
Ön plan konumu
Uygulamanız, konum bilgilerini yalnızca bir kez veya belirli bir süre boyunca paylaşan ya da alan bir özellik içeriyorsa bu özellik ön planda konum erişimi gerektirir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:
- Bir navigasyon uygulamasında bulunan bir özellik, kullanıcıların adım adım yol tarifi almasına olanak tanıyor.
- Bir mesajlaşma uygulamasındaki bir özellik, kullanıcıların geçerli konumlarını başka bir kullanıcıyla paylaşmasına olanak tanır.
Uygulamanızın bir özelliği aşağıdaki durumlardan birinde cihazın mevcut konumuna erişirse sistem, uygulamanızı ön plan konumunu kullanıyor olarak kabul eder:
- Uygulamanıza ait bir etkinlik 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ı farkındalığını artırır. Uygulamanız, arka plana yerleştirildiğinde (ör. kullanıcı, cihazındaki Ana Sayfa düğmesine bastığında veya cihazının ekranını kapattığında) erişimi korur.
Ayrıca, aşağıdaki kod snippet'inde gösterildiği gibi ön plan hizmet türünü
location
olarak bildirmeniz önerilir. Android 10 (API düzeyi 29) ve sonraki sürümlerde bu ön plan hizmet türünü belirtmeniz 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>
Aşağıdaki snippet'te gösterildiği gibi uygulamanız ACCESS_COARSE_LOCATION
izni veya ACCESS_FINE_LOCATION
izni istediğinde ön planda konum ihtiyacını beyan etmiş olursunuz:
<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
Uygulamanın içindeki bir özellik sürekli olarak diğer kullanıcılarla konum bilgisi paylaşıyorsa veya Geofencing API'yi kullanıyorsa uygulama arka planda konum erişimi gerektirir. Aşağıda konuyla ilgili birkaç örnek verilmiştir:
- Aile konum paylaşımı uygulamasında bulunan bir özellik, kullanıcıların sürekli olarak aile üyeleriyle konum paylaşmasına olanak tanır.
- Bir IoT uygulamasında bulunan bir özellik, kullanıcıların ev cihazlarını yapılandırabilmelerini sağlar. Böylece kullanıcı evden çıktığında kapanır ve kullanıcı eve döndüğünde tekrar açılır.
Sistem, ön plan konumu bölümünde açıklananlar dışında herhangi bir durumda cihazın mevcut konumuna erişen uygulamanızı arka planda konum bilgisi kullanıyor olarak kabul eder. Arka planda konum hassasiyeti, uygulamanızın beyan ettiği konum izinlerine bağlı olan ön plan konum hassasiyeti 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 beyan etmeniz gerekir. Android'in önceki sürümlerinde, uygulamanız ön planda konum erişimi aldığında otomatik olarak arka planda konum erişimini 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
üzerinden alınıyorsa bu tahmin yaklaşık 3 kilometrekare (yaklaşık 1,2 milkare) doğru olabilir.ACCESS_COARSE_LOCATION
iznini beyan ettiğinizde, ancakACCESS_FINE_LOCATION
iznini beyan etmediğinizde uygulamanız konumları bu doğruluk düzeyinde alabilir. - Tam
- Olabildiğince doğru bir cihaz konumu tahmini sağlar. Konum tahmini
LocationManagerService
veyaFusedLocationProvider
aralığındaysa bu tahmin genellikle yaklaşık 50 metre (160 fit) dahilinde ve bazen birkaç metre ya da daha iyi doğrulukta olabilir.ACCESS_FINE_LOCATION
iznini beyan ettiğinizde uygulamanız bu doğruluk düzeyindeki konumları 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 edecektir. Uygulamanızdaki bir özellik, ACCESS_FINE_LOCATION
iznini kullanarak mutlaka tam konuma erişim gerektiriyorsa kullanıcıdan uygulamanızın tam konuma erişmesine izin vermesini isteyebilirsiniz.
Çalışma zamanında konum erişimi iste
Uygulamanızdaki bir özellik için konum erişimi gerektiğinde 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 da açıklandığı gibi, çalışma zamanı izinlerini bağlam içinde isteme ile ilgili en iyi uygulamayı izler.
Şekil 1'de, bu işlemin nasıl gerçekleştirileceğine ilişkin bir örnek gösterilmektedir. Uygulama, ön planda konum erişimi gerektiren bir "konum paylaş" özelliği içeriyor. Ancak uygulama, kullanıcı Konum paylaş düğmesini seçene kadar konum izni istemez.
Kullanıcı yalnızca yaklaşık konum verebilir
Android 12 (API düzeyi 31) veya sonraki sürümlerde kullanıcılar, uygulamanız ACCESS_FINE_LOCATION
çalışma zamanı izni istese bile uygulamanızın yalnızca yaklaşık konum bilgilerini almasını isteyebilir.
Bu potansiyel kullanıcı davranışını işlemek için ACCESS_FINE_LOCATION
iznini tek başına talep etmeyin. 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
için istekte bulunmaya çalışırsanız sistem, Android 12'nin bazı sürümlerinde isteği yoksayar. Uygulamanız Android 12 veya sonraki sürümleri hedefliyorsa sistem, Logcat'e aşağıdaki hata mesajını günlüğe 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 kutusu, kullanıcı için aşağıdaki seçenekleri içerir:
- Kesin: Uygulamanızın tam konum bilgileri almasına izin verir.
- Yaklaşık: Uygulamanızın yalnızca yaklaşık konum bilgilerini almasına izin verir.
Şekil 3'te, iletişim kutusunda kullanıcının seçim yapmasına yardımcı olmak amacıyla her iki seçenek için görsel bir işaret bulunduğunu gösterilmiştir. Kullanıcı konum doğruluğuna karar verdikten sonra üç düğmeden birine dokunarak izin verme süresini seçer.
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 önceki sürümleri çalıştıran bir cihaza yüklenmiş olsa da kullanıcı cihazı Android 12 veya sonraki bir sürüme yükseltse bile geçerlidir.
ACCESS_COARSE_LOCATION
isteğinde bulunduğunda gösterilen sistem izinleri iletişim kutusu.ACCESS_FINE_LOCATION
hem de ACCESS_COARSE_LOCATION
istediğinde görünen sistem izinleri iletişim kutusu.
Kullanıcı tercihi izin vermelerini etkiler
Aşağıdaki tabloda, kullanıcının izin çalışma zamanı iletişim kutusunda belirlediği seçeneklere bağlı olarak sistem tarafından uygulamanıza verilen izinler gösterilmektedir:
Tam | Yaklaşık | |
---|---|---|
Uygulamayı kullanırken | ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION |
ACCESS_COARSE_LOCATION |
Yalnızca 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. Jetpack kitaplıklarını aşağıdakine benzer bir kodda kullanabilir veya izin isteği kodunu kendiniz yönetebileceğ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 bulunun
Kullanıcıdan uygulamanızın erişimini yaklaşık konumdan tam konuma yükseltmesini isteyebilirsiniz. Ancak kullanıcıdan uygulamanızın erişimini tam konuma yükseltmesini istemeden önce, uygulamanızın kullanım alanının mutlaka bu düzeyde hassasiyet gerektirip gerektirmediğini değerlendirin. Uygulamanızın bir cihazı Bluetooth veya kablosuz ağ üzerinden yakındaki cihazlarla eşlemesi gerekiyorsa ACCESS_FINE_LOCATION
iznini istemek yerine tamamlayıcı cihaz eşleme veya Bluetooth izinlerini kullanmayı düşünün.
Kullanıcıdan uygulamanızın konum erişimini yaklaşık konumdan tam konuma yükseltmesini istemek için aşağıdakileri yapın:
- Gerekirse uygulamanızın neden izne ihtiyacı olduğunu açıklayın.
ACCESS_FINE_LOCATION
veACCESS_COARSE_LOCATION
izinlerini birlikte tekrar isteyin. Kullanıcı, sistemin uygulamanıza yaklaşık konum vermesine zaten izin verdiği için sistem iletişim kutusu şekil 4 ve şekil 5'te gösterildiği gibi bu sefer farklıdır:
Başlangıçta yalnızca ön planda konum iste
Uygulamanızın birçok özelliği konum erişimi gerektirse bile bu özelliklerin yalnızca bazıları büyük olasılıkla arka planda konum erişimine ihtiyaç duyar. Bu nedenle, uygulamanızın ön planda konum erişimi, ardından arka planda konum erişimi isteyen ek istekleri yerine getirmesi önerilir. Artımlı istekler gerçekleştirerek kullanıcılara daha fazla kontrol ve şeffaflık sağlarsınız. Bu sayede kullanıcılar, uygulamanızdaki hangi özelliklerin arka planda konum erişimine ihtiyacı olduğunu daha iyi anlayabilir.
Şekil 6'da artımlı istekleri karşılamak üzere tasarlanmış bir uygulama örneği gösterilmektedir. Hem "geçerli konumu göster" hem de "yakındaki yerleri öner" özellikleri ön planda konum erişimini gerektirir. Ancak yalnızca "yakındaki yerleri öner" özelliği arka planda konum erişimine ihtiyaç duyar.
Ek istekleri gerçekleştirme süreci aşağıdaki gibidir:
-
İlk olarak, uygulamanız kullanıcıları Şekil 1'deki "konumu paylaş" özelliği veya Şekil 2'deki "mevcut konumu göster" özelliği gibi ön planda konum erişimi gerektiren özelliklere 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.
-
Kullanıcı daha sonra arka planda konuma erişim gerektiren işlevleri keşfederken arka planda konum erişimi isteyebilirsiniz.
Gerekirse arka planda konum isteğinde bulunma
İ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 isteğinde bulunduğunda sistem izinleri iletişim kutusu Her zaman izin ver adlı bir seçenek içerir. Kullanıcı bu seçeneği belirlerse uygulamanızdaki özellik arka planda konuma erişim elde eder.
Ancak Android 11 (API düzeyi 30) ve sonraki sürümlerde sistem iletişim kutusu Her zaman izin ver seçeneğini içermez. Bunun yerine, kullanıcılar Şekil 7'de gösterildiği gibi bir ayarlar sayfasında arka planda konumu etkinleştirmelidir.
Arka planda konum izni isterken en iyi uygulamaları izleyerek kullanıcıların bu ayarlar sayfasına gitmesine yardımcı olabilirsiniz. İzni verme süreci, uygulamanızın hedef SDK sürümüne bağlıdır.
Uygulama Android 11 veya sonraki bir sürümü hedefliyor
Uygulamanıza ACCESS_BACKGROUND_LOCATION
izni verilmediyse ve shouldShowRequestPermissionRationale()
, true
değerini döndürürse kullanıcılara aşağıdakileri içeren eğitici bir kullanıcı arayüzü gösterin:
- Uygulamanızın özelliğinin neden arka planda konuma 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()
numarasını arayabilirsiniz. Bu yöntemin döndürülen değeri, kullanıcının cihaz dili tercihine göre yerelleştirilmiştir. - Kullanıcıların izni reddetmesi için bir seçenek. Kullanıcılar arka planda konuma erişimi reddederse uygulamanızı kullanmaya devam edebilirler.
Uygulama Android 10 veya önceki sürümleri hedefliyor
Uygulamanızdaki bir özellik arka planda konuma erişim istediğinde kullanıcılar bir sistem iletişim kutusu görür. Bu iletişim kutusunda, bir ayarlar sayfasında uygulamanızın konum izni seçeneklerine gitme seçeneği bulunur.
Uygulamanız konum izni istemeyle ilgili en iyi uygulamaları zaten kullandığı sürece bu davranışı desteklemek için herhangi bir değişiklik yapmanız gerekmez.
Kullanıcı arka planda konumun doğruluğunu etkileyebilir
Kullanıcı yaklaşık konum 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
iznini verir ancak ön planda yalnızca yaklaşık konum erişimi verirse uygulamanız da arka planda yalnızca yaklaşık konum erişimine sahip olur.
Arka planda konum izniyle ilgili hatırlatma
Android 10 ve sonraki sürümlerde, kullanıcı arka planda konum erişimi izni verdikten sonra uygulamanızdaki bir özellik 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 erişmesine her zaman izin verdiğini hatırlatır. Örnek bir bildirim Şekil 8'de gösterilmiştir.
Uygulamanızın SDK bağımlılıklarında konum şartlarını kontrol edin
Uygulamanızın konum izinlerine bağlı SDK'lar (özellikle de ACCESS_FINE_LOCATION
izni) kullanıp kullanmadığını kontrol edin. SDK bağımlılıklarınızın davranışlarını anlama hakkındaki bu Medium makalesini inceleyin.
Ek kaynaklar
Android'deki konum izinleri hakkında daha fazla bilgi için aşağıdaki materyalleri görüntüleyin:
Codelab uygulamaları
Videolar
Sana Özel
- Konum izinlerinin kullanımını gösteren örnek uygulama.