Kullanıcı gizliliğini korumak için konum hizmetlerini kullanan uygulamalar konum izinleri istemelidir.
Konum izinleri istediğinizde diğer tüm çalışma zamanı izinlerini tercih ettiğiniz en iyi uygulamaları izleyin. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izne sahip olmasıdır. Hangi izinleri istediğiniz ve bunları nasıl isteyeceğiniz, uygulamanızın kullanım alanına ilişkin konum gereksinimlerine bağlıdır.
Bu sayfada, konumla ilgili farklı gereksinimler açıklanmakta ve her bir durumda konum izninin nasıl isteneceği konusunda yol gösterici bilgiler 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ızda, konum bilgilerini yalnızca bir kez veya belirli bir süre boyunca paylaşan ya da alan bir özellik bulunuyorsa bu özellik ön planda konuma erişim izni gerektirir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:
- Bir navigasyon uygulamasındaki ö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 mevcut 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 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ı 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şmeye devam eder.
Ayrıca, aşağıdaki kod snippet'inde gösterildiği gibi
location
ön plan hizmeti türünü bildirmeniz önerilir. Android 10 (API düzeyi 29) ve sonraki sürümlerde bu ön plan hizmet türünü bildirmeniz 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
veya ACCESS_FINE_LOCATION
iznini 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
Bir uygulama, içindeki bir özellik sürekli konumunu diğer kullanıcılarla paylaşıyorsa veya Geofencing API'yi kullanıyorsa arka planda konum erişimine ihtiyaç duyar. Aşağıda konuyla ilgili birkaç örnek verilmiştir:
- Ailelere yönelik konum paylaşımı uygulamalarındaki bir özellik, kullanıcıların aile üyeleriyle sürekli olarak konum paylaşmasına olanak tanır.
- Bir IoT uygulamasındaki ö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, uygulamanızın ön plan konumu bölümünde açıklananlar dışında bir durumda cihazın mevcut konumuna erişiyorsa uygulamanızı arka planda konum bilgisi kullanıyor olarak kabul eder. Arka planda konum hassasiyeti, ön plandaki konum hassasiyeti ile aynıdır. Bu hassasiyet, uygulamanızın beyan ettiği konum izinlerine bağlı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 eski sürümlerinde, uygulamanız ön planda konum erişimi aldığında arka planda konum erişimini de otomatik olarak 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
aralığından ise bu tahmin yaklaşık 3 kilometrekare (yaklaşık 1,2 mil) aralığında doğru olur.ACCESS_COARSE_LOCATION
iznini beyan ettiğinizde uygulamanız bu doğruluk düzeyinde konum alabilir ancakACCESS_FINE_LOCATION
iznini bildirmez. - Tam
- Olabildiğince doğru bir cihaz konumu tahmini sağlar. Konum tahmini
LocationManagerService
veyaFusedLocationProvider
aralığındaysa bu tahmin genellikle yaklaşık 50 metrelik bir mesafedir ve bazen birkaç metre ya da daha iyi doğru olabilmektedir.ACCESS_FINE_LOCATION
iznini beyan ettiğinizde uygulamanız bu doğruluk seviyesinde konum alabilir.
Kullanıcı yaklaşık konum izni verirse uygulamanız, belirttiğ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 etmelidir. Uygulamanızdaki bir özellik, ACCESS_FINE_LOCATION
iznini kullanarak kesinlikle 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 özelliğin konum erişimine ihtiyacı olduğunda izin isteğinde bulunmadan önce kullanıcı özellikle etkileşimde bulunana kadar bekleyin. Bu iş akışı, uygulama izinlerini nasıl isteyeceğinizi açıklayan kılavuzda da açıklandığı gibi, çalışma zamanı izinlerini bağlam içinde isteme şeklindeki 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 "konumu paylaş" özelliği içeriyor. Ancak kullanıcı Konumu paylaş düğmesini seçene kadar uygulama 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 olası 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
iznini hem de ACCESS_COARSE_LOCATION
iznini isteyin. Yalnızca ACCESS_FINE_LOCATION
için istekte bulunmayı denerseniz 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:
- Tam: 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, kullanıcının seçim yapmasına yardımcı olmak amacıyla iletişim kutusunda her iki seçenek için de görsel bir işaret olduğu gösterilmektedir. Kullanıcı, konumun doğruluğuna karar verdikten sonra üç düğmeden birine dokunarak izin verme süresini belirler.
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ş ve ardından kullanıcı cihazı Android 12 veya sonraki bir sürüme yükseltse bile geçerlidir.
Kullanıcı seçimi, izinlerin verilmesini etkiler
Aşağıdaki tabloda, kullanıcının izin çalışma zamanı iletişim kutusunda belirlediği seçeneklere bağlı olarak 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ı 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 konumun yükseltilmesini isteyin
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 bu düzeyde kesinlik gerektirip gerektirmediğini değerlendirin. Uygulamanızın Bluetooth veya kablosuz ağ üzerinden yakındaki cihazlarla bir cihazı eşlemesi gerekiyorsa ACCESS_FINE_LOCATION
iznini istemek yerine tamamlayıcı cihaz eşleme özelliğini 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 bu 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 bunlardan yalnızca bazıları arka planda konum erişimine ihtiyaç duyabilir. Bu nedenle, uygulamanızın ön planda konum erişimi, ardından arka planda konum erişimi isteyerek konum izinleri için ek istekler gerçekleştirmesi ö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 ele almak ü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şimi gerektirir. Ancak yalnızca "yakındaki yerleri öner" özelliği için arka planda konum erişimi gerekir.
Ek istekleri gerçekleştirme süreci şu şekildedir:
-
Uygulamanız başlangıçta, Ş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 kullanıcıları 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.
-
Daha sonra, kullanıcı arka planda konum erişimi gerektiren işlevleri keşfettiğinde arka planda konum erişimi isteyebilirsiniz.
Gerekirse arka planda konum bilgisi isteme
İ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 kutusunda Her zaman izin ver adlı bir seçenek bulunur. Kullanıcı bu seçeneği belirlerse uygulamanızdaki özellik arka planda konum erişimine sahip olur.
Ancak Android 11 (API düzeyi 30) ve sonraki sürümlerde sistem iletişim kutusunda Her zaman izin ver seçeneği bulunmaz. Bunun yerine, kullanıcıların Şekil 7'de gösterildiği gibi bir ayarlar sayfasında arka planda konumu etkinleştirmesi gerekir.
Arka planda konum izni isterken en iyi uygulamalardan yararlanarak 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 bir eğitici kullanıcı arayüzü gösterin:
- Uygulamanızın özelliklerinin 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 konum erişimi istediğinde kullanıcılar bir sistem iletişim kutusu görür. Bu iletişim kutusu, bir ayarlar sayfasında uygulamanızın konum izni seçeneklerine gitmenizi sağlayan bir seçenek içerir.
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 konum doğruluğunu etkileyebilir
Kullanıcı yaklaşık konum istiyorsa 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
izni verirse ancak ön planda yalnızca yaklaşık konum erişimi verirse uygulamanız 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, 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. Şekil 8'de örnek bir bildirim bulunmaktadır.
Uygulamanızın SDK bağımlılıklarında konum şartlarını kontrol edin
Uygulamanızın, konum izinlerine (özellikle de ACCESS_FINE_LOCATION
izni) bağlı SDK'lar kullanıp kullanmadığını kontrol edin. SDK bağımlılıklarınızın davranışlarını tanıma hakkındaki bu Medium makalesini inceleyin.
Ek kaynaklar
Android'de konum izinleri hakkında daha fazla bilgi için aşağıdaki malzemeleri görüntüleyin:
Codelab uygulamaları
Videolar
Numuneler
- Konum izinlerinin kullanımını göstermek için örnek uygulama.