Android'de izinlerle çalışmak ve Permission denied hatasını düzeltmek
İlk 200 karakterde: Permission denied hatasını düzeltmek için manifest dosyasını kontrol edin, checkSelfPermission() ile runtime kontrolü yaptığınızdan emin olun, kullanıcıdan izin isteyin (ActivityCompat.requestPermissions) veya hata ayıklama süresince adb shell pm grant ile izni verin; ardından makaledeki kontrol listesini takip edin.
İzinler neden gereklidir ve türleri nelerdir?
İzinler kullanıcı verilerini korur. Android 6.0 ile birlikte runtime izinleri eklendi: tehlikeli (dangerous) izinler uygulama çalışırken istenmelidir; normal izinler otomatik olarak verilir; signature/system izinleri yalnızca sistem/imzalı uygulamalar içindir; special izinler ayrı ayarlar gerektirir (MANAGE_EXTERNAL_STORAGE, POST_NOTIFICATIONS vb.). Gerekli izin olmadan bir API'ye erişim denediğinizde SecurityException ("Permission denied") alırsınız.
Android 11 ve üzeri sürümlerde depolama için doğrudan erişim yerine SAF veya MediaStore kullanmayı değerlendirin; MANAGE_EXTERNAL_STORAGE ayarlardan manuel olarak etkinleştirilmelidir.
İzinleri doğru şekilde istemek ve kontrol etmek (pratik)
- AndroidManifest.xml dosyasına izni ekleyin:
<uses-permission android:name="android.permission.CAMERA" />
- Korumalı API'yi çağırmadan önce durumu kontrol edin:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), REQ)
} else {
// erişim var
}
- Sonucu işleyin:
override fun onRequestPermissionsResult(req: Int, perms: Array<String>, res: IntArray) {
if (req == REQ && res.isNotEmpty() && res[0] == PackageManager.PERMISSION_GRANTED) {
// Tamam
} else {
if (shouldShowRequestPermissionRationale(perms[0])) showRationale()
else openAppSettings() // "Bir daha sorma" seçildiyse
}
}
- Jetpack Compose için permission-helper kütüphanelerini (Accompanist/Compose API'leri) kullanın.
- İlgili izinleri gruplayın, ancak kullanıcıya neden gerekli olduklarını açıklayın.
Tekrar istemeden önce açıklama (rationale) gösterin: bu, onay oranlarını artırır.
pm grant / ADB: Ne zaman ve nasıl kullanılır?
Hata ayıklama ve otomasyon için ADB üzerinden (USB hata ayıklama açıkken) izin verebilir/geri alabilirsiniz:
Verme:
adb shell pm grant com.example.app android.permission.CAMERA
Geri alma:
adb shell pm revoke com.example.app android.permission.CAMERA
Kontrol etme:
adb shell dumpsys package com.example.app | grep permission
pm grant sistem ayrıcalıkları sağlamaz: bazı izinler yalnızca sistem/imzalı uygulamalar için gereklidir. Bunu üretim ortamında kullanmayın — sadece test ve CI için kullanın.
"Permission denied" hatasını düzeltmek için adım adım plan
- Manifest: <uses-permission ...> belirtilmiş mi?
- Runtime: API'yi kullanmadan önce checkSelfPermission() ve requestPermissions() çağrılıyor mu?
- Target SDK: targetSdkVersion < 23 ise davranış farklıdır — testlerde bunu dikkate alın.
- Scoped Storage: Android 10+ üzerinde dosyalara erişim için MediaStore/SAF kullanın; WRITE_EXTERNAL_STORAGE yeni sürümlerde doğrudan erişim sağlamaz.
- Verileri temizleyip yeniden yükleyin: adb shell pm clear com.example.app; ardından tekrar kontrol edin.
- pm grant sonrası sorun devam ediyorsa: SELinux günlüklerini inceleyin (dmesg | grep denied) — politika erişimi engelliyor olabilir.
- Foreground servisleri ve bildirimler için: ilgili izinleri unutmayın (örneğin, yeni Android sürümleri için FOREGROUND_SERVICE, POST_NOTIFICATIONS).
Tipik bir istisna örneği: java.lang.SecurityException: Permission denied (missing INTERNET permission?)
Sık yapılan hatalar
- Manifest'te
unutulmuş. - API çağrısından önce izin kontrolü yapılmamış.
- Kullanıcı kalıcı olarak reddetmiş — ayarlara yönlendirme yerine requestPermissions çağrılmaya devam ediliyor.
- Android 11+ üzerinde SAF/MediaStore kullanmadan doğrudan dosya erişimi bekleniyor.
- pm grant'in sistem/SELinux sorunlarını çözeceği varsayılıyor.
SSS
- Kullanıcı "Bir daha sorma"yı seçerse ne yapılmalı?
ACTION_APPLICATION_DETAILS_SETTINGS üzerinden uygulama ayarlarını açın ve erişimin neden gerekli olduğunu açıklayın. - CI üzerinde izin vermeyi otomatikleştirmek mümkün mü?
Evet — hata ayıklaması açık olan emülatörlerde veya test cihazlarında adb (pm grant) ile. - Neden emülatörde izin var ama gerçek cihazda yok?
Ek üretici politikaları, SELinux veya targetSdk/OS sürüm farkı olabilir; günlükleri kontrol edin.
Sonuç: Her zaman manifest ve runtime kontrolünü yapın, izin listesini minimumda tutun, birden fazla Android sürümünde test edin ve adb pm grant'i yalnızca hata ayıklama için kullanın.