Dosyalara erişim için hangi izinler gerekir ve nasıl istenir

Kerem Aydın·7 Temmuz 2026·⏱2 dk

Kısa cevap: Android < 11 (API < 30) için READ/WRITE_EXTERNAL_STORAGE gereklidir; Android 10+ için Scoped Storage — MediaStore ve SAF kullanılması önerilir; tam erişim (MANAGE_EXTERNAL_STORAGE) yalnızca dar kullanım durumları (dosya yöneticileri) için izin verilir ve Play Console'da gerekçelendirme gerektirir. Aşağıda pratik talimatlar ve hazır örnekler bulabilirsiniz.

İzin türleri ve ne zaman gerekli oldukları

  • READ_EXTERNAL_STORAGE / WRITE_EXTERNAL_STORAGE — eski cihazlarda genel dosyalar için klasik izinler (maxSdkVersion 32). Android 10 ile birlikte kullanımları kısıtlanmıştır.
  • Scoped Storage (Android 10+ / 11+) — uygulamanın kendi klasörlerine, MediaStore aracılığıyla medya kütüphanesine ve SAF aracılığıyla ayrı ayrı seçilen dosyalara erişim sağladığı sistem. Varsayılan olarak önerilir.
  • MANAGE_EXTERNAL_STORAGE — "tam erişim" (Tüm dosyalara erişim). Yalnızca gerçek ihtiyacı olan uygulamalar için (dosya yöneticileri, yedekleme araçları). Mağazalarda politika ve inceleme gerektirir.

Belgeler ve rastgele dosyalarla çalışmak için Storage Access Framework (SAF) kullanın — kullanıcı dosyaları kendisi seçer ve genel izinlere gerek kalmaz.

AndroidManifest.xml dosyasına izinler nasıl eklenir

Klasik izinleri maxSdkVersion ile sınırlayarak ekleyin:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
                 android:maxSdkVersion="32"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
                 android:maxSdkVersion="32"/>
<!-- Yalnızca tam erişim durumları için -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

maxSdkVersion="32", yeni API'lerde sistemin Scoped Storage kullanmasını garanti eder.

Kodda izinler nasıl doğru şekilde istenir (Kotlin)

ActivityResult API'sini kullanın:

private val requestPermissionLauncher =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
        if (granted) loadFiles()
        else showRationaleDialog()
    }

private fun requestStoragePermission() {
    when {
        ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
            == PackageManager.PERMISSION_GRANTED -> loadFiles()
        shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE) -> showRationaleDialog()
        else -> requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
    }
}

shouldShowRequestPermissionRationale() == true ise mutlaka açıklama (rationale) gösterin — aksi takdirde kullanıcı reddi "hatırlayabilir".

Genel izinler olmadan dosyalarla çalışma

  • Medya (fotoğraf/video/ses): Medya içeriğini okumak/yazmak için MediaStore kullanın.
  • Belgeler/herhangi bir dosya: SAF aracılığıyla seçiciyi açın:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_OPENABLE)
    type = "*/*"
}
startActivityForResult(intent, REQUEST_CODE_OPEN)
  • Uygulamaya ait dosyalar için getExternalFilesDir() kullanın — izin gerekmez.

MANAGE_EXTERNAL_STORAGE sıkı şekilde kontrol edilir. Açık bir gerekçelendirme olmadan istek, uygulama mağazasında reddedilecektir.

Sık yapılan hatalar

  • Uygulama başlangıcında izin istemek yerine Just-In-Time yaklaşımını kullanmamak — dönüşüm oranını düşürür.
  • shouldShowRequestPermissionRationale() öğesini görmezden gelmek — kullanıcı erişimin neden gerekli olduğunu anlamaz.
  • Yalnızca bir API üzerinde test yapmak: Davranışı Android 9, 10, 11+ üzerinde kontrol edin.
  • Gereksiz yere MANAGE_EXTERNAL_STORAGE istemek — moderasyon sırasında engellenme riski.

SSS

  • Android 11+ üzerinde WRITE_EXTERNAL_STORAGE gerekli mi?
    Hayır, medya içeriği için MediaStore kullanın; belgeler için SAF kullanın. WRITE_EXTERNAL_STORAGE çoğu görev için eskimiştir.

  • MANAGE_EXTERNAL_STORAGE ne zaman istenmeli?
    Yalnızca uygulama gerçekten tam erişim gerektiriyorsa (dosya yöneticisi). Mağaza için detaylı gerekçelendirme hazırlayın ve erişimi minimize etme mantığını uygulayın.

  • Kullanıcıya izinler olmadan dosya seçimi nasıl sunulur?
    SAF aracılığıyla (ACTION_OPEN_DOCUMENT / ACTION_CREATE_DOCUMENT). Bu, tekil dosyalarla çalışmak için en iyi yaklaşımdır.

  • SAF aracılığıyla dosya seçildikten sonra URI saklanmalı mı?
    Evet — daha sonra erişim planlıyorsanız, persistable URI iznini ContentResolver.takePersistableUriPermission() aracılığıyla kaydedin.

Bu uygulamalara uyarak, uygulamanız farklı Android sürümlerinde doğru çalışacak, yayınlama reddi risklerini minimize edecek ve kullanıcı güvenini artıracaktır.