Runtime Permission: hangi türleri vardır ve Android'de çalışma prensibi

Yazar: IT Sectr Yayınlanma: 2026-05-20 Okuma süresi: 8 dk

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, hassas verilere erişmek için kullanıcının açık onayını gerektiren bir Android mekanizmasıdır.
  • Tehlikeli izinler, çalışma zamanı isteği gerektiren bir izin grubudur (kamera, mikrofon, coğrafi konum, kişiler).
  • Normal izinler, sistem tarafından otomatik olarak onaylanır ve çalışma zamanı isteği gerektirmez (INTERNET, ACCESS_NETWORK_STATE).
  • Tek kullanımlık izinler, Android 11'de tanıtılan, uygulama kapatıldığında otomatik olarak iptal edilen tek oturumluk izinlerdir.
  • shouldShowRequestPermissionRationale, istekten önce kullanıcıya bir açıklama gösterilmesi gerekip gerekmediğini belirten bir işarettir.

Runtime Permission Nedir?

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 İzin Modelinin Evrimi

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.

Android'de Runtime Permission Nasıl Çalışır?

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.

ActivityResultLauncher ile İzin İsteği

kotlin
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'de İzin Türleri

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.

Tehlikeli İzin Grupları

GrupİzinlerAPI Seviyesi
CAMERACAMERAAPI 23+
LOCATIONACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATIONAPI 23+ (arka plan — API 29+)
STORAGEREAD_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE, READ_MEDIA_IMAGES (API 33+)API 23+ (API 33'te değişiklikler)
PHONEREAD_PHONE_STATE, CALL_PHONE, READ_CALL_LOGAPI 23+
MICROPHONERECORD_AUDIOAPI 23+
CONTACTSREAD_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTSAPI 23+
NOTIFICATIONSPOST_NOTIFICATIONSAPI 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+'da İzin İsteği

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.

Tek Kullanımlık İzinleri Ele Alma

kotlin
// 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ı Reddetmelerini Ele Alma

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.

Reddetmeleri Ele Alma Stratejisi

İ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.

Güvenlik Önerileri

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.

İzin İsteği Kuralları

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'da İzin Denetimi

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

Tek seferlik reddetme ile kalıcı reddetme nasıl ayırt edilir?

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.

Aynı anda birden fazla izin istenebilir mi?

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 ve Wear OS'de runtime permissions nasıl çalışır?

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.

Android 16'da izinlerde hangi değişiklikler bekleniyor?

Ö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.

Android runtime permission ile iOS arasındaki fark nedir?

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

  • Runtime Permission, gerçek kullanım anında hassas veri talep etmek için bir mekanizmadır, Android 6.0'da tanıtılmıştır.
  • Tehlikeli izinler açık bir sistem diyaloğu gerektirir; normal izinler otomatik olarak onaylanır.
  • Tek kullanımlık izinler (Android 12+) uygulama kapatıldığında iptal edilir, kullanıcı gizliliğini artırır.
  • shouldShowRequestPermissionRationale, önceki bir reddetme olup olmadığını belirler ve istek stratejisi seçimine yardımcı olur.
  • Android 13, POST_NOTIFICATIONS'ı runtime permission olarak ekledi; Android 14, arka plan coğrafi konum gereksinimlerini sıkılaştırdı.
  • Fotoğraf Seçici (API 33+), görsel seçimi için READ_EXTERNAL_STORAGE ihtiyacının yerini alır.
  • Kullanıcı reddettiğinde her zaman bir yedek plan sağlayın — veri girişi veya manuel seçim için alternatif bir yol.

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.

Projeyi tartış

Ayrıca okuyun