Android'de Dangerous Permission: nedir, izin listesi ve runtime isteği

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

Dangerous Permission, uygulama çalışırken runtime diyalogu aracılığıyla kullanıcının açık rızasını gerektiren bir Android izin kategorisidir. Android Geliştirici Kılavuzu, 2024'e göre, tehlikeli izinler ProtectionLevel dangerous değerine sahiptir ve hassas verilere erişim sağlar: kamera, mikrofon, konum ve kişiler. Kullanıcının açık rızası olmadan uygulama bu özellikleri kullanamaz.

Ana Noktalar

  • Dangerous Permission — ProtectionLevel dangerous değerine sahip, runtime isteği gerektiren Android izinleri.
  • İstek, ActivityCompat.requestPermissions aracılığıyla onRequestPermissionsResult içinde işlenerek yapılır.
  • Kullanıcı, uygulamanın Ayarlar bölümünden tehlikeli bir izni istediği zaman iptal edebilir.
  • İstekten önce, durum ContextCompat.checkSelfPermission ile kontrol edilmelidir.
  • Liste, CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION, READ_CONTACTS ve diğerlerini içerir.

Android'de Dangerous Permission Nedir

Dangerous Permission, kullanıcının hassas verilerine erişim sağlayan bir Android sistem izinleri kategorisidir. Normal izinlerin aksine, tehlikeli izinler kurulum sırasında otomatik olarak verilmez — uygulamanın Android 6.0 Marshmallow (API 23) ile tanıtılan runtime mekanizması aracılığıyla çalışma zamanında bunları açıkça talep etmesi gerekir.

Açık istek ihtiyacı, bu izinlerin koruduğu verilerin doğasından kaynaklanır: kullanıcı konumu, kişisel kişiler, kamera ve mikrofon içeriği, arama geçmişi ve SMS. Android bu verileri hassas olarak değerlendirir ve kullanıcının bilinçli olarak erişim izni vermesini gerektirir. Android Privacy Sandbox (2024)'e göre, kullanıcılar ortalama olarak runtime isteklerinin yaklaşık yüzde 30'unu reddeder.

Dangerous Permission'ın temel bir özelliği, istediği zaman iptal edilebilmesidir. Kullanıcı Ayarlar — Uygulamalar — İzinler bölümüne giderek herhangi bir tehlikeli izni kapatabilir. Uygulama, daha önce verilmiş bir iznin yeniden başlatma olmaksızın herhangi bir zamanda iptal edilebileceğine hazırlıklı olmalıdır.

ProtectionLevel dangerous

dangerous koruma seviyesi, OS düzeyindeki sistem izin tanımlarında belirlenir. Bir uygulama bu protectionLevel ile uses-permission bildirdiğinde, sistem izni runtime isteği gerektiren olarak işaretler. Normalin aksine, tehlikeli izinler her zaman sistem izin yönetimi arayüzünde görüntülenir ve iptal edilebilir.

Permission Group ve Dangerous

Tüm tehlikeli izinler, işlevsel kategoriye göre Permission Groups içinde gruplandırılır. Örneğin, CAMERA ve CAMERA2 CAMERA grubunda, ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION LOCATION grubundadır. Kullanıcı bir gruptan bir izin verdiyse, aynı gruptaki kalan izinler ek diyalog olmadan otomatik olarak verilir.

Runtime İsteği Nasıl Çalışır

Runtime isteği, uygulamanın bir izin istek diyalogu görüntülemek için sistem API'sini çağırdığı bir mekanizmadır. Kullanıcı, izin adı ve İzin Ver ile Reddet butonlarını içeren bir modal pencere görür. Yanıttan sonra sistem, sonuçla birlikte onRequestPermissionsResult geri çağrısını çağırır.

Tam döngü üç adım içerir: checkSelfPermission ile durum kontrolü, izin verilmemişse requestPermissions çağrısı ve onRequestPermissionsResult içinde sonucun işlenmesi. Durum kontrolü zorunludur çünkü kullanıcı ayarlar aracılığıyla izni herhangi bir zamanda iptal etmiş olabilir ve kontrol etmeden bir işlevi çağırmak SecurityException ile sonuçlanır.

kotlin
fun checkAndRequestCameraPermission() {
    when {
        ContextCompat.checkSelfPermission(
            this,
            Manifest.permission.CAMERA
        ) == PackageManager.PERMISSION_GRANTED -> {
            openCamera()
        }
        else -> {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.CAMERA),
                REQUEST_CAMERA_CODE
            )
        }
    }
}

Sonuç işleme, ActivityResultLauncher veya onRequestPermissionsResult içinde gerçekleşir. Önerilen modern yaklaşım, açık istek kodları olmadan daha temiz bir API sağlayan ActivityResultContracts.RequestPermission kullanmaktır. Bu sözleşme bir Boolean döndürür — iznin verilip verilmediği.

İstek için En İyi Uygulamalar

Tehlikeli izinleri, uygulama başlangıcında değil, kesinlikle özelliğin kullanımı bağlamında isteyin. Kullanıcı kamera düğmesine bastıysa — CAMERA isteyin. Bir harita açtıysa — LOCATION isteyin. Bağlamsal istekler, ilk başlatmada tüm izinleri istemekten iki kat daha fazla izin verilmesi sağlar. Kullanıcının hangi özelliğin erişim gerektirdiğini anlaması için aynı anda birden fazla izin istenmemesi de önerilir.

Android'de Tehlikeli İzinlerin Listesi

Android, her biri bir veya daha fazla sabit içeren birkaç tehlikeli izin grubu tanımlar. En kapsamlı liste Manifest.permission sınıfında mevcuttur. Aşağıda geliştirmede kullanılan ana gruplar ve izinler verilmiştir.

İzin GrubuİzinlerAPI Erişimi
CAMERACAMERACamera API, CameraX
LOCATIONACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATIONFusedLocationProvider, Geofence
MICROPHONERECORD_AUDIOMediaRecorder, AudioRecord
PHONEREAD_PHONE_STATE, CALL_PHONE, READ_CALL_LOGTelephonyManager
CONTACTSREAD_CONTACTS, WRITE_CONTACTS, GET_ACCOUNTSContactsContract
SMSREAD_SMS, SEND_SMS, RECEIVE_SMSSmsManager
STORAGEREAD_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGEMediaStore, File API
CALENDARREAD_CALENDAR, WRITE_CALENDARCalendarContract

Android 12+'da Yeni İzinler

Android 12'den başlayarak Google, bazı izinler için gereksinimleri sıkılaştırdı. Örneğin, BLUETOOTH_CONNECT ve BLUETOOTH_SCAN tehlikeli hale geldi ve runtime isteği gerektiriyor. Sensörlere arka plan erişimi için BODY_SENSORS_BACKGROUND izni de eklendi. Geliştiricilerin targetSdkVersion'u güncellemesi ve istekleri mevcut OS sürümlerinde test etmesi gerekir.

Android 13+ için İzinler

Android 13 (API 33), bildirimler (POST_NOTIFICATIONS) ve medya dosyaları (READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO) için yeni izinler getirerek genel READ_EXTERNAL_STORAGE'ın yerini aldı. Artık fotoğraflara, videolara ve sese erişim, tek bir diyalog olmadan uzmanlaşmış izinler aracılığıyla ayrı ayrı talep edilir.

Dangerous vs Normal Permission

Dangerous ve Normal Permission, verme şekli, iptal edilebilirlik ve UX açısından temelde farklılık gösterir. Normal kurulum sırasında otomatik olarak verilir, Dangerous açık bir runtime diyalogu gerektirir. Normal ayarlar aracılığıyla iptal edilemez, Dangerous istediği zaman devre dışı bırakılabilir. Bu asimetri farklı geliştirme desenleri oluşturur.

Kod açısından bakıldığında, tehlikeli izinler daha fazla iş gerektirir: checkSelfPermission, requestPermissions, reddetme işleme. Normal izinler için AndroidManifest.xml'de bir satır yeterlidir. Bununla birlikte, Dangerous Permission kullanıcıya kontrol verir, bu da özellikle kamera veya konum gibi hassas özellikler için güveni artırır.

Kategoriler arasındaki seçim geliştiriciye ait değildir — sistem tarafından belirlenir. Geliştirici yalnızca uses-permission bildirir ve sistem protectionLevel'a göre kategoriyi belirler. Ancak, tehlikeli izinleri isteme stratejisi kullanıcı deneyimini etkiler: sık veya uygunsuz diyaloglar uygulamanın puanını düşürür.

Kotlin'de İzinler Nasıl İstenir

Modern yol Kotlin'de izin istemek için ActivityResultContracts.RequestMultiplePermissions veya RequestPermission kullanmaktır. Bu sözleşmeler androidx.activity kitaplığının bir parçasıdır ve onRequestPermissionsResult'u geçersiz kılmaya gerek kalmadan lambda tabanlı temiz bir API sağlar.

kotlin
class CameraActivity : AppCompatActivity() {
    private val requestPermissionLauncher =
        registerForActivityResult(
            ActivityResultContracts.RequestPermission()
        ) { isGranted: Boolean ->
            if (isGranted) {
                openCamera()
            } else {
                showPermissionDeniedMessage()
            }
        }

    fun requestCamera() {
        when {
            ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.CAMERA
            ) == PackageManager.PERMISSION_GRANTED ->
                openCamera()
            ActivityCompat.shouldShowRequestPermissionRationale(
                this,
                Manifest.permission.CAMERA
            ) ->
                showRationaleDialog()
            else ->
                requestPermissionLauncher.launch(
                    Manifest.permission.CAMERA
                )
        }
    }
}

Aynı Anda Birden Fazla İzin İsteme

Bir uygulamanın aynı anda birden fazla tehlikeli izne ihtiyacı olduğunda, RequestMultiplePermissions kullanın. Sözleşme, anahtarın izin adı ve değerin sonuç olduğu Map<String, Boolean> döndürür. Bu, video kaydı için CAMERA ve RECORD_AUDIO istemeniz gereken ilk başlatmada kullanışlıdır.

İlk Reddetmeyi İşleme

Kullanıcı isteği reddederse, shouldShowRequestPermissionRationale yöntemi true döndürür. Bu, iznin neden gerekli olduğuna dair bir açıklama gösterilmesi gerektiğini belirtir. En iyi uygulama, bir açıklama ve Tekrar Dene butonu içeren özel bir diyalog göstermektir. Kullanıcı, Never Ask Again onay kutusunu işaretleyerek isteği tekrar reddederse, shouldShowRequestPermissionRationale false döndürecek ve Ayarlar'a yönlendirmeniz gerekir.

Reddetme ve Never Ask Again İşleme

Never Ask Again, kullanıcının runtime diyalogunu ikinci kez reddederken ayarlayabileceği bir işarettir. Bundan sonra, bu izin için standart diyalog artık gösterilmez. Erişim izni vermenin tek yolu, kullanıcıyı sistem uygulama ayarlarına yönlendirmektir.

Geliştiricinin iki reddetme senaryosunu ayırt etmesi gerekir: birincisi, shouldShowRequestPermissionRationale true döndürdüğünde (kullanıcı reddetti ancak diyalog hâlâ gösterilebilir) ve ikincisi, yöntem false döndürdüğünde (Never Ask Again etkin veya izin politika tarafından engellenmiş). İkinci durumda, Ayarları Aç butonu göstermelisiniz.

kotlin
fun handlePermissionDenied(permission: String) {
    if (ActivityCompat.shouldShowRequestPermissionRationale(
            this, permission
    )) {
        showRationaleDialog(permission)
    } else {
        showSettingsRedirectDialog(permission)
    }
}

private fun showSettingsRedirectDialog(permission: String) {
    AlertDialog.Builder(this)
        .setTitle("Erişim reddedildi")
        .setMessage(
            "İzin engellendi. Ayarları açın."
        )
        .setPositiveButton("Ayarlar") { _, _ ->
            val intent = Intent(
                Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                Uri.fromParts(
                    "package", packageName, null
                )
            )
            startActivity(intent)
        }
        .show()
}

shouldShowRequestPermissionRationale false döndürdüyse izni tekrar istememek önemlidir. Bu durumda requestPermissions için tekrarlanan bir çağrı diyalog göstermez — sonuç açıklama olmadan hemen DENIED ile döner. Kullanıcı net olmayan bir davranışla karşılaşır ve bu, uygulama deneyimini olumsuz etkiler.

Sıkça Sorulan Sorular

Android'de hangi izinler tehlikeli kabul edilir?

Tehlikeli izinler, ProtectionLevel dangerous değerine sahip izinleri içerir: CAMERA, RECORD_AUDIO, ACCESS_FINE_LOCATION, READ_CONTACTS, READ_SMS, READ_CALENDAR ve diğerleri. Tam liste Manifest.permission sınıfında mevcuttur.

Tehlikeli bir iznin verilip verilmediği nasıl kontrol edilir?

ContextCompat.checkSelfPermission kullanarak bağlamı ve izin adını iletin. Yöntem PERMISSION_GRANTED veya PERMISSION_DENIED döndürür. Kontrol, tehlikeli bir izin gerektiren her API çağrısından önce yapılmalıdır.

Tehlikeli izinler için Permission Group nedir?

Permission Group, ilgili tehlikeli izinleri gruplandırır. Kullanıcı bir gruptan bir izin verirse, diğerleri otomatik olarak verilir. Örneğin, LOCATION, ACCESS_FINE_LOCATION ve ACCESS_COARSE_LOCATION'ı içerir.

Never Ask Again nasıl işlenir?

Reddetmeden sonra shouldShowRequestPermissionRationale kontrol edin. Yöntem false döndürürse ve izin hâlâ verilmemişse — Never Ask Again etkindir. Kullanıcıyı ACTION_APPLICATION_DETAILS_SETTINGS ile Intent aracılığıyla Ayarlar'a yönlendirin.

Android 13+'da tehlikeli izinler gerekli midir?

Evet, zorunlu olmaya devam ediyorlar. Android 13+'da bazı izinler değişti: POST_NOTIFICATIONS ayrı bir runtime izni haline geldi ve READ_EXTERNAL_STORAGE, medya dosyalarına ayrıntılı erişim için READ_MEDIA_IMAGES ile değiştirildi.

Özet

  • Dangerous Permission — ProtectionLevel dangerous değerine sahip, kullanıcıdan açık bir runtime isteği gerektiren Android izinleri.
  • Mekanizma üç adım içerir: checkSelfPermission, requestPermissions ve onRequestPermissionsResult.
  • Kullanıcı, sistem ayarları aracılığıyla tehlikeli bir izni istediği zaman iptal edebilir.
  • Ana gruplar: CAMERA, LOCATION, MICROPHONE, PHONE, CONTACTS, SMS, STORAGE, CALENDAR.
  • ActivityResultContracts.RequestPermission, istek kodları olmadan Kotlin'de istemek için modern API'dir.
  • ShouldShowRequestPermissionRationale, ilk reddetme ile Never Ask Again arasında ayrım yapmaya yardımcı olur.
  • Android 13+'da yeni izinler ortaya çıktı: POST_NOTIFICATIONS ve STORAGE'ın yerini alan READ_MEDIA_IMAGES.

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