Android 13'te depolama izinleriyle nasıl çalışılır
Android 13'te multimedya erişimi granüler hale geldi: genel READ_EXTERNAL_STORAGE yerine READ_MEDIA_IMAGES/VIDEO/AUDIO kullanılıyor; tek seferlik dosya seçimi için Photo Picker tercih ediliyor; MANAGE_EXTERNAL_STORAGE yalnızca gerçek "tüm dosyalar" senaryoları için.
Android 13'te tam olarak neler değişti
Android 13, medya okuma için üç ayrı runtime izni getirdi: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO ve READ_MEDIA_AUDIO. Scoped storage temel model olarak kalıyor: uygulama varsayılan olarak yalnızca kendi dizinlerini görür. Tek tek dosya seçimi için sistem Photo Picker'ı önerilir; bu, runtime izni istemeden URI sağlar. MANAGE_EXTERNAL_STORAGE "hepsi bir arada" seçeneği olarak kalmaya devam ediyor, ancak verilmesi sıkı şekilde kontrol ediliyor ve yayınlama sırasında gerekçelendirme gerektiriyor.
Göreviniz kullanıcıya bir veya birkaç fotoğraf/video seçtirmekse, Photo Picker veya SAF kullanın: bu, küresel izinler istemekten daha basit ve güvenlidir.
Hangi izin veya aracın ne zaman kullanılacağı
Medyaya erişim yöntemlerinin karşılaştırılması
| Görev | Araç / izin | Ne zaman kullanılmalı |
|---|---|---|
| Tek seferlik fotoğraf/video seçimi | Photo Picker / ACTIONOPENDOCUMENT | Kullanıcının dosyaları kendisinin seçmesi gerektiğinde her zaman |
| Toplu resim okuma | READMEDIAIMAGES | Galeri, fotoğraf analizi, hedef API 33+ |
| Toplu video okuma | READMEDIAVIDEO | Video kütüphanesini görüntüleme/işleme |
| Toplu ses okuma | READMEDIAAUDIO | Oynatıcılar, ses analizi |
| Tüm dosyalara erişim | MANAGEEXTERNALSTORAGE | Dosya yöneticileri, yedeklemeler — yalnızca alternatif olmadığında |
Pratik kural: İzin setini minimize edin — yalnızca gerçekten gerekli olanları isteyin.
Pratik geçiş: adım adım yapılması gerekenler
- targetSdkVersion'ı 33+ seviyesine çıkarın ve testleri çalıştırın: eski depolama izinlerinin davranışı değişecektir.
- Erişim senaryolarını analiz edin: tek seferlik seçim mi, toplu çalışma mı, yoksa tam erişim mi.
- Dosya seçimi için Photo Picker / SAF uygulayın — bu, izin mantığı gereksinimlerini azaltır.
- Toplu medya okuma gerekiyorsa, manifest'e ilgili READ_MEDIA_* izinlerini ekleyin ve bunları dinamik olarak isteyin. Kullanıcıya isteğin nedenini açıklayın.
- Yazma işlemi için MediaStore.insert/update veya ACTION_CREATE_DOCUMENT kullanın; WRITE_EXTERNAL_STORAGE'dan kaçının.
- MANAGE_EXTERNAL_STORAGE — yalnızca SAF/MediaStore ile yapılamıyorsa uygulayın; Play Console için belgelenmiş bir gerekçe hazırlayın.
Basit bir izin isteme örneği (Kotlin):
// kayıt
val request = registerForActivityResult(ActivityResultContracts.RequestPermission()) { ok ->
if (ok) { /* erişim var */ } else { /* ipucu göster veya Ayarlar'a yönlendir */ }
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_MEDIA_IMAGES)
!= PackageManager.PERMISSION_GRANTED) {
request.launch(Manifest.permission.READ_MEDIA_IMAGES)
}
Photo Picker çağrısı örneği:
val pick = registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
uri?.let {
contentResolver.takePersistableUriPermission(it, Intent.FLAG_GRANT_READ_URI_PERMISSION)
// işleme
}
}
pick.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo))
Sık yapılan hatalar
- API 33+ üzerinde WRITE_EXTERNAL_STORAGE istenmesi — iletişim kutusu görünmeyebilir; READ_MEDIA_* veya Photo Picker kullanın.
- Tek bir granted READ_EXTERNAL_STORAGE'nın tümünü kapsadığı varsayılması — artık haklar granülerdir.
- "Kullanıcı iki kez reddetti" senaryosunun işlenmemesi — ayarlara açık bir yol önerin.
- Eski/standart olmayan ROM'larda Photo Picker kullanılabilirliğinin kontrol edilmemesi — SAF'e fallback yapın.
MANAGE_EXTERNAL_STORAGE'yı son çare olmadan istemeyin: moderasyonda reddedilme riski artar ve kullanıcı güvenini kaybedersiniz.
SSS
- Genel medya kütüphanesine yazmak için WRITE_EXTERNAL_STORAGE gerekir mi?
Hayır. Yazma işlemi için MediaStore API veya ACTION_CREATE_DOCUMENT kullanın; WRITE_EXTERNAL_STORAGE scoped storage için eskidi. - Hızlı medya erişimi sağlayan mini bir galeri göstermek gerekirse ne yapılmalı?
İlgili READ_MEDIA_* izinlerini (yalnızca gerekli olanları) isteyin ve kullanıcıya amacı açıklayın. - Photo Picker tüm cihazlarda mevcut mu?
Modern cihazlarda evet; eski OEM ROM'ları için SAF veya kendi seçicinize fallback yapın.
Geçiş kontrol listesi
- [ ] Senaryoları ayırdınız: seçim vs toplu çalışma vs tam erişim.
- [ ] Mümkün olan her yerde Photo Picker/SAF entegre edildi.
- [ ] Manifest'te yalnızca gerekli READ_MEDIA_* izinleri belirtilmiş ve dinamik olarak isteniyor.
- [ ] Yazma işlemi için MediaStore veya ACTION_CREATE_DOCUMENT kullanılıyor.
- [ ] MANAGE_EXTERNAL_STORAGE gerekiyorsa — açıklama ve gizlilik politikası hazırlandı.
İsterseniz, dosya erişimi modülünüz için bir yama veya Android 11–14 ile popüler cihazlarda test etmek üzere bir test planı hazırlayabilirim.