Runtime Permission, Android 6.0'da (API 23) tanıtılan, uygulama çalışırken izin isteme mekanizmasıdır. Yükleme sırasında izin vermenin aksine, runtime permissions, kullanıcının hassas verilere (kamera, coğrafi konum, kişiler) erişimi istediği zaman vermesine veya iptal etmesine olanak tanır. Android Developers (2026)'a göre, Google Play'deki uygulamaların %85'inden fazlası en az bir runtime permission kullanır.
Önemli Noktalar
Runtime Permission, uygulamanın, bu işlevsellik kullanıcı için gerçekten gerekli olduğu anda hassas verilere erişim talep ettiği bir Android güvenlik modelidir. Android 6.0'dan önce, tüm izinler uygulama yüklemesi sırasında verilirdi ve kullanıcı, uygulamayı tamamen kaldırmadan izinleri iptal edemezdi.
Android 6.0'dan önce, kullanıcı yükleme sırasında tüm izinlerin bir listesini görür ve ya hepsini kabul eder ya da yüklemeyi reddederdi. 2015 tarihli bir araştırma, kullanıcıların %87'sinin yükleme sırasında izin listesini okumadığını gösterdi. Android 6.0, runtime permissions'ı tanıtarak izinleri normal (otomatik) ve tehlikeli (istek gerektiren) olarak ayırdı. Android 11, tek kullanımlık izinleri ekledi — uygulama kapatıldığında otomatik iptal. Android 13, Fotoğraf Seçici ve push bildirimlerini ayrı runtime permissions olarak tanıttı.
iOS, iOS 10'dan beri benzer bir model kullanır; kamera, mikrofon ve coğrafi konuma erişim ilk kullanımda istenir. Ancak iOS, “normal izinler” kavramına sahip değildir — her izin açıkça istenir ve geliştirici sistem ayarları aracılığıyla yeniden talep edene kadar reddetme devam eder.
Runtime Permission, requestPermissions() yöntemi (AndroidX — ActivityResultLauncher) tarafından çağrılan bir sistem diyaloğu aracılığıyla çalışır. Sistem bir açıklama ile standart bir diyalog gösterir ve kullanıcı “İzin Ver” veya “Reddet” seçeneğini seçer. Yanıttan sonra, uygulamanın kullanıcının kararını işlediği bir geri çağrı tetiklenir.
private lateinit var requestPermissionLauncher: ActivityResultLauncher<String>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
requestPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
if (isGranted) {
startCamera()
} else {
showPermissionDeniedDialog()
}
}
}
private fun checkCameraPermission() {
when {
ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
== PackageManager.PERMISSION_GRANTED -> {
startCamera()
}
ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) -> {
showRationaleDialog { requestPermissionLauncher.launch(Manifest.permission.CAMERA) }
}
else -> {
requestPermissionLauncher.launch(Manifest.permission.CAMERA)
}
}
}
shouldShowRequestPermissionRationale yöntemi, kullanıcı isteği daha önce bir kez reddettiğinde true döndürür. Bu durumda, uygulamanın izne neden ihtiyaç duyduğunu açıklayan bir diyalog gösterilmesi ve ancak daha sonra yeniden istekte bulunulması önerilir. Bu, kullanıcı onayı olasılığını %30–40 oranında artırır (Google I/O 2024 verileri).
Android, tüm izinleri birkaç koruma seviyesine ayırır: normal, tehlikeli, imza ve özel. Normal izinler, yükleme sırasında otomatik olarak verilir. Tehlikeli izinler, çalışma zamanı isteği gerektirir. İmza izinleri, yalnızca aynı sertifika ile imzalanmış uygulamalar tarafından kullanılabilir.
| Grup | İzinler | API Seviyesi |
|---|---|---|
| CAMERA | CAMERA | API 23+ |
| LOCATION | ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATION | API 23+ (arka plan — API 29+) |
| STORAGE | READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, READ_MEDIA_IMAGES (API 33+) | API 23+ (API 33'te değişiklikler) |
| PHONE | READ_PHONE_STATE, CALL_PHONE, READ_CALL_LOG | API 23+ |
| MICROPHONE | RECORD_AUDIO | API 23+ |
| CONTACTS | READ_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTS | API 23+ |
| NOTIFICATIONS | POST_NOTIFICATIONS | API 33+ |
Özel izinler (SYSTEM_ALERT_WINDOW, WRITE_SETTINGS, MANAGE_EXTERNAL_STORAGE), Settings.ACTION_MANAGE_OVERLAY_PERMISSION aracılığıyla sistem ayarlarına ek gezinme gerektirir. Bu izinler standart sistem diyaloğu aracılığıyla istenemez ve ayarlar ekranında kullanıcının açık eylemini gerektirir.
Android 12, runtime permissions modelinde önemli değişiklikler getirdi. Tek kullanımlık izinler, kameraya, mikrofona veya coğrafi konuma erişimi yalnızca bir oturum için vermeye olanak tanır. Kullanıcı uygulamayı kapattığında izin otomatik olarak iptal edilir. Gizlilik göstergeleri, durum çubuğunda bir uygulamanın kamera veya mikrofon kullandığını gösteren yeşil göstergelerdir.
// Android 12+ — tek kullanımlık konum iznini ele alma
private fun checkLocationPermission() {
val permissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
val fineLocationGranted = permissions[Manifest.permission.ACCESS_FINE_LOCATION]
val coarseLocationGranted = permissions[Manifest.permission.ACCESS_COARSE_LOCATION]
if (fineLocationGranted == true) {
showUserLocation()
} else {
showLocationDisabledDialog()
}
}
permissionLauncher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}
// İznin sistem tarafından iptal edilip edilmediğini kontrol et (Android 12+)
class PermissionReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Intent.ACTION_PERMISSION_REVOCATION) {
handleRevokedPermission(intent.getStringExtra(Intent.EXTRA_REVOKED_PERMISSION))
}
}
}
Android 13, POST_NOTIFICATIONS iznini tehlikeli gruba ekleyerek push bildirimleri göndermek için açık istek gerektirdi. Android 14, arka plan coğrafi konumuna kısıtlamalar getirdi: uygulama, arka plan konumu istediğinde her seferinde kullanıcının açık onayını almalıdır. Fotoğraf Seçici (API 33+), görsel seçimi için READ_EXTERNAL_STORAGE ihtiyacının yerini aldı.
Kullanıcının bir izin isteğini reddetmesi, doğru şekilde ele alınması gereken normal bir durumdur. İki tür reddetme vardır: tek seferlik (kullanıcı “Reddet” düğmesine bastı) ve kalıcı (kullanıcı “Tekrar sorma” seçeneğini seçti). İkinci durumda, sistem diyaloğu artık görünmeyecek ve uygulamanın kullanıcıyı sistem ayarlarına yönlendirmesi gerekir.
İlk reddetmeden sonra, uygulama bir gerekçe diyaloğu göstermelidir — iznin neden gerekli olduğuna dair kendi açıklaması. Kullanıcı tekrar reddederse, uygulama Settings.ACTION_APPLICATION_DETAILS_SETTINGS aracılığıyla uygulama ayarları ekranına yönlendirmelidir. Material 3, daha doğal bir kullanıcı deneyimi için PermissionRequestBottomSheet kullanılmasını önerir.
Reddetme durumunda uygulama işlevselliğini tamamen engellememek önemlidir. Örneğin, kullanıcı coğrafi konumu reddettiyse, uygulama manuel adres girişi sunmalıdır. Kamera için, galeriden bir görsel yüklemeye izin verin. Google, tüm runtime permissions için her zaman bir yedek mekanizma sağlanmasını önerir.
Runtime permissions yalnızca teknik bir mekanizma değil, aynı zamanda kullanıcının uygulamaya olan güveninin bir unsurudur. Uygunsuz bir zamanda (örneğin, ilk açılışta) izin istemek, onay olasılığını önemli ölçüde azaltır. Google Play Store, izin isteklerinin sıklığını ve bağlamını analiz eder: agresif istekleri olan uygulamalar aramada daha düşük sıralamalar alır.
Bağlam — izni gerektiren eylemi gerçekleştirmeden hemen önce isteyin. Minimum — yalnızca özelliğin çalışması için gerçekten gerekli olan izinleri isteyin. Şeffaflık — sistem diyaloğundan önce kullanıcıya iznin neden gerekli olduğunu açıklayın. İptal — çalışma zamanında izin iptalini doğru şekilde ele almak için ACTION_PERMISSION_REVOCATION abone olun.
Runtime permissions'ı test etmek için adb komutlarını kullanın: adb shell pm revoke <package> android.permission.CAMERA, uygulamayı yeniden yüklemeden izin iptalini simüle etmeye olanak tanır. Espresso ve UiAutomator, GrantPermissionRule aracılığıyla izin diyaloglarını test etmeyi destekler. Runtime permissions kullanan uygulamalar için bu araçların CI/CD hattına entegrasyonu zorunludur.
Google Play Console, geliştiricilerin izinlerin ne sıklıkta istendiğini, kullanıcıların yüzde kaçının erişim verdiğini ve hangi izinlerin iptal edildiğini görebileceği bir izin denetimi bölümü sağlar. Bu verilerin analizi, verimsiz istekleri belirlemeye ve kullanıcı deneyimini optimize etmeye yardımcı olur. Örneğin, kullanıcıların %40'ından azı coğrafi konum veriyorsa, istek zamanlamasını gözden geçirin ve daha ikna edici bir gerekçe ekleyin.
İzinle ilgili ANR'yi (Uygulama Yanıt Vermiyor) izlemek için Android Vitals kullanımı da kritiktir. Bir izin isteği ana iş parçacığında yürütülürse veya sistem diyaloğu kullanıcı arayüzünü bloke ederse, yavaş cihazlarda ANR'ye neden olabilir. Kullanıcı arayüzünü bloke etmekten kaçınmak için izin kontrolünü ve isteğini ayrı bir iş parçacığına taşıyın veya eşzamansız işleme için Kotlin coroutines kullanın.
Sıkça Sorulan Sorular
shouldShowRequestPermissionRationale, kalıcı reddetmede false döndürür (kullanıcı “Tekrar sorma” seçeneğini seçtiğinde). Yöntem, tek seferlik reddetmede true döndürerek bir gerekçe diyaloğu gösterilmesine olanak tanır. Yöntem false döndürürse, tek seçenek kullanıcıyı sistem ayarlarına yönlendirmektir.
Evet, ActivityResultContracts.RequestMultiplePermissions, tek bir çağrıda bir dizi izin istemeye olanak tanır. Sistem, her izin için sırayla diyaloglar gösterecektir. Mantıksal olarak ilişkili izinlerin gruplandırılması önerilir (örneğin, video kaydı için CAMERA ve RECORD_AUDIO), ancak bir seferde 2–3'ten fazla istenmemelidir.
Android TV, TV ekranında diyaloglar gösteren aynı runtime permissions modelini kullanır. Wear OS sürüm 3+, runtime permissions'ı destekler, ancak diyaloglar saatte gösterilir. Android Auto için, tüm izinler telefonda istenir ve araç sistemi, bir köprü bağlantısı aracılığıyla zaten onaylanmış izinleri alır.
Ön bilgilere göre, Android 16, tek kullanımlık izinler için 24 saat sonra otomatik iptal ile “izin süresi dolumu” getiriyor. Arka plan konumu için daha katı gereksinimler ve yeni kategoriler (ortam sensörleri, Wi-Fi taraması) için genişletilmiş tehlikeli izin listesi de bekleniyor. Kesin ayrıntılar 2027'nin üçüncü çeyreğinde ortaya çıkacak.
iOS, “normal izinleri” desteklemez — her izin bir sistem diyaloğu aracılığıyla açıkça istenir. Kullanıcı, ayarlar aracılığıyla istediği zaman izni iptal edebilir. Temel fark, iOS'un checkSelfPermission benzeri bir yöntemle izin durumunu önceden kontrol etmemesidir: sistem, korumalı bir API'ye ilk erişimde otomatik olarak bir diyalog gösterir.
Özet
POST_NOTIFICATIONS'ı runtime permission olarak ekledi; Android 14, arka plan coğrafi konum gereksinimlerini sıkılaştırdı.READ_EXTERNAL_STORAGE ihtiyacının yerini alır.Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun