Kullanıcı gizliliğini korumak için konum hizmetlerini kullanan uygulamaların konum izinleri istemesi gerekir.
Konum izni isterken diğer tüm çalışma zamanı izinleri için kullandığınız en iyi uygulamaları uygulayın. Konum izinleriyle ilgili önemli bir fark, sistemin konumla ilgili birden fazla izin içermesidir. Hangi izinleri istediğiniz ve bunları nasıl istediğiniz, uygulamanızın kullanım alanı için konum koşullarına bağlıdır.
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ı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ı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, 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 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 olması gerekir. Aşağıda konuyla ilgili olarak bazı örnekler verilmiştir:
- Bir aile konum paylaşımı uygulamasında, kullanıcıların konumu aile üyeleriyle sürekli olarak paylaşmasına olanak tanıyan bir özellik.
- 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 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ğrulukta 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, 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 ö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ışı, uygulama izinlerinin nasıl isteneceğini açıklayan kılavuzda açıklandığı gibi, bağlama dayalı çalışma zamanında izin istemeyle 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 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, tek bir çalışma zamanında istek göndererek hem ACCESS_FINE_LOCATION
izinini hem de ACCESS_COARSE_LOCATION
izinini 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
izni istediğinde sistem izinleri iletişim kutusu kullanıcıya aşağıdaki seçenekleri sunar:
- Tam: Uygulamanızın tam konum bilgisi almasına olanak tanır.
- Yaklaşık: Uygulamanızın yalnızca yaklaşık konum bilgisi 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 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 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ı 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ınındaki 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ı, 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ı istek 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 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 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 konum erişimi elde eder.
Ancak Android 11 (API düzeyi 30) ve sonraki sürümlerde sistem iletişim kutusunda Her zaman izin ver seçeneği yer almaz. 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ı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 planda konum bilgisine neden erişmesi gerektiğine dair net bir açıklama.
- Arka planda konum izni veren ayar seçeneğinin kullanıcı tarafından görülebilen etiketi (örneğin, şekil 7'deki 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 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ılar bir sistem iletişim kutusu görür. Bu iletişim kutusunda, uygulamanızın konum izni seçeneklerine ayar sayfasından 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 izin verir 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 izni hatırlatıcısı
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'da yer alan 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.