Kullanıcı gizliliğini korumak için konum hizmetlerini kullanan uygulamaların konum izinleri istemesi gerekir.
Konum izni isterken diğer çalışma zamanı izinlerinde yararlandığınız en iyi uygulamaları izleyin. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri istediğiniz ve bunları nasıl isteyeceğiniz, uygulamanızın kullanım alanıyla ilgili konum koşullarına bağlıdır.
Bu sayfada, farklı konum koşulları 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ızda konum bilgilerini yalnızca bir kez veya belirli bir süre boyunca paylaşan ya da alan bir özellik varsa bu özellik için ön planda konum erişimi gerekir. Buna örnek olarak aşağıdakiler verilebilir:
- Bir navigasyon uygulamasında, kullanıcıların adım adım yol tarifi almasına olanak tanıyan bir özellik.
- 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 bir etkinlik görünür.
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. 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, aşağıdaki kod snippet'inde gösterildiği gibi
location
ön plan hizmet türü tanımlamanız önerilir. Android 10 (API düzeyi 29) ve sonraki sürümlerde bu ön plan hizmeti 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 aşağıdaki snippet'te gösterildiği gibi ACCESS_COARSE_LOCATION
veya ACCESS_FINE_LOCATION
iznini istediğinde ö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 konum bilgilerini aile üyeleriyle sürekli olarak paylaşmasına olanak tanır.
- 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 doğruluğu, uygulamanızın beyan ettiği konum izinlerine bağlı olan ön planda konum doğruluğu 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 belirtmeniz gerekir. Android'in önceki sürümlerinde, uygulamanız ön planda konum erişimi aldığında otomatik olarak arka planda konum erişimi de elde eder.
<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_COARSE_LOCATION
iznini beyan edipACCESS_FINE_LOCATION
iznini beyan ettiğinizde uygulamanız bu doğruluk düzeyinde konumları 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, 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 eder. 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 özelliğin konum erişimine ihtiyacı olduğunda, 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 açıklandığı gibi, çalışma zamanında izin isteğinde bulunmayla ilgili en iyi uygulamayı izler.
Şekil 1'de bu işlemin nasıl yapılacağına dair bir örnek gösterilmektedir. Uygulama, ön planda konum erişimi gerektiren bir "konum 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 izni verebilir
Android 12 (API düzeyi 31) veya sonraki sürümlerde, uygulamanız ACCESS_FINE_LOCATION
çalışma zamanı izni istese bile kullanıcılar 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, tek bir çalışma zamanı isteğinde hem ACCESS_FINE_LOCATION
hem de ACCESS_COARSE_LOCATION
iznini isteyin. 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
isteğinde bulunduğunda, sistem izinleri iletişim kutusunda kullanıcı için aşağıdaki seçenekler yer alır:
- Tam: Uygulamanızın tam konum bilgilerini 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, 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 daha eski bir sürüm çalıştıran bir cihaza yüklendikten sonra kullanıcının cihazı Android 12 veya daha yeni 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 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ürüldüğü değeri kontrol edin. Jetpack kitaplıklarını aşağıdakine benzer bir kodda 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 tam konuma erişimini yükseltmesini istemeden önce, uygulamanızın kullanım alanının mutlaka bu hassasiyet düzeyini gerektirip gerektirmediğini düşünün. Uygulamanızın, Bluetooth veya kablosuz ağ üzerinden yakındaki cihazlarla bir cihazı eşlemesi gerekiyorsa ACCESS_FINE_LOCATION
izni istemek yerine tamamlayıcı cihaz eşleme veya Bluetooth izinlerini kullanmayı düşünün.
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ı, sistemin uygulamanıza yaklaşık konum izni vermesine zaten izin verdiğinden, sistem iletişim kutusu bu kez şekil 4 ve şekil 5'te gösterildiği gibi farklıdır:
Başlangıçta yalnızca ön planda konum bilgisi isteğinde bulunun
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ı istekleri işlemek için tasarlanmış bir uygulama örneği gösterilmektedir. Hem "mevcut 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.
Artımlı istekler gerçekleştirme süreci aşağıdaki gibidir:
-
Uygulamanız ilk başta kullanıcıları ön planda konum erişimi gerektiren özelliklere (ör. Şekil 1'deki "konumu paylaş" özelliği veya Şekil 2'deki "mevcut konumu göster" özelliği) yönlendirmelidir.
Uygulamanızın ön planda konuma erişimi 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 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, Android 10 (API düzeyi 29) çalıştıran bir cihazda arka planda konum bilgisi istediğinde sistem izinleri iletişim kutusunda Her zaman izin ver adlı bir seçenek yer alır. Kullanıcı bu seçeneği belirlerse uygulamanızdaki özellik arka planda konuma erişim kazanır.
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 arka plan konumunu Şekil 7'de gösterildiği gibi bir ayarlar sayfasında etkinleştirmesi gerekir.
Arka planda konum izni isterken en iyi uygulamaları uygulayarak kullanıcıların bu ayarlar sayfasına gitmesine yardımcı olabilirsiniz. İzin verme süreci, uygulamanızın hedef SDK sürümüne bağlıdır.
Uygulama, Android 11 veya sonraki sürümleri hedefliyor
Uygulamanız için ACCESS_BACKGROUND_LOCATION
izni verilmediyse ve shouldShowRequestPermissionRationale()
, true
değerini döndürürse kullanıcılara aşağıdakileri içeren bir eğitim kullanıcı arayüzü gösterin:
- Uygulamanızın özelliğinin arka planda konum bilgisine neden 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()
numaralı telefonu arayabilirsiniz. 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 sunulan bir seçenek. Kullanıcılar arka planda konum erişimini 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ılara bir sistem iletişim kutusu gösterilir. 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 bilgisi 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
iznine ancak ön planda yalnızca yaklaşık konum erişimi izni 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, uygulamanızdaki bir özellik kullanıcı arka planda konum erişimi verdikten sonra 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 her zaman erişmesine izin verdiğini hatırlatır. Şekil 8'de örnek bir bildirim gösterilmektedir.
Uygulamanızın SDK bağımlılıklarına ilişkin konum şartlarını kontrol etme
Uygulamanızın, özellikle ACCESS_FINE_LOCATION
izni olmak üzere konum izinlerine bağlı SDK'lar kullanıp kullanmadığını kontrol edin. SDK bağımlılıklarınızın davranışlarını öğrenme hakkında Medium'daki bu makaleyi inceleyin.
Ek kaynaklar
Android'deki konum izinleri hakkında daha fazla bilgi için aşağıdaki materyalleri inceleyin:
Codelab uygulamaları
Videolar
Örnekler
- Konum izinlerinin kullanımını gösteren örnek uygulama.