Storage Access Framework — bu tizim tanlash dialogi orqali fayllar va hujjatlarga xavfsiz kirish uchun Android freymvorkidir. Keng xotirani o‘qish ruxsatlarini so‘rash o‘rniga, ilova foydalanuvchi tanlagan faylga URI-havolani oladi. Android Developers (2026) ma‘lumotlariga ko‘ra, SAF DocumentProvider orqali mahalliy xotirani, Google Drive va Dropbox bulut xizmatlarini qo‘llab-quvvatlaydi. Freymvork Android 4.4 da joriy qilingan va Android 10 dan boshlab hujjatlar bilan ishlash standartiga aylangan.
Asosiy fikrlar
Storage Access Framework — bu tizim dialogi orqali hujjatlarni tanlash va yaratish uchun yagona interfeysni ta‘minlovchi Android SDK qismidir. SAF fayllarning jismoniy joylashuvini abstraksiya qiladi: ilova fayl qayerdan o‘qilayotganini bilmaydi — mahalliy diskdan, Google Drive yoki Dropboxdan.
SAF arxitekturasi uch komponentni o‘z ichiga oladi: so‘rovni boshlovchi mijoz ilovasi, standart fayl tanlash dialogi — tizim tanlovchisi va muayyan ombor fayllariga kirishni amalga oshiruvchi kontent provayderi — DocumentProvider. Foydalanuvchi ma‘lumot manbasidan qat‘iy nazar yagona interfeysni ko‘radi.
SAF Android 4.4 (API 19) dan boshlab mavjud. Dastlab freymvork faqat hujjatlarni qo‘llab-quvvatlagan, ammo Android 5.0 da ACTION_OPEN_DOCUMENT_TREE orqali kataloglarni qo‘llab-quvvatlash qo‘shilgan. Android 10 dan boshlab SAF app-specific storage dan tashqaridagi har qanday faylga kirish uchun tavsiya etilgan usulga aylandi.
SAF ACTION_OPEN_DOCUMENT harakati bilan Intent orqali tizim fayl tanlash dialogini ishga tushiradi. Foydalanuvchi mavjud manbalar ro‘yxatini ko‘radi: ichki xotira, Google Drive, Dropbox va boshqa ro‘yxatdan o‘tgan provayderlar. Fayl tanlangandan so‘ng, tizim vaqtinchalik kirish huquqlari bilan content URI qaytaradi.
Content URI formati content://com.android.externalstorage.documents/document/primary/Download/file.pdf. file:// URI dan farqli o‘laroq, content URI faylning haqiqiy yo‘lini oshkor etmaydi va DocumentProvider orqali ishlaydi. Ilova faylni olingan URI bo‘yicha ContentResolver.openInputStream orqali o‘qiydi.
Tizim tanlovchisi avtomatik ravishda MIME turlari bo‘yicha fayllarni qidirish, saralash va filtrlashni qo‘llab-quvvatlaydi. Dasturchi Intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "image/*")) orqali kerakli turlarni belgilaydi va tanlovchi faqat tegishli fayllarni ko‘rsatadi.
Odatiy bo‘lib, URI ilova qayta ishga tushirilguncha yoki qurilma qayta yuklanguncha amal qiladi. Uzoq muddatli kirish uchun ilova takePersistableUriPermission ni so‘raydi — bu dialog orqali qayta tanlamasdan keyingi ishga tushirishlarda faylni o‘qishga imkon beradi.
SAF fayllar bilan ishlash uchun uchta asosiy harakatni taqdim etadi: ochish, yaratish va papka daraxtini tanlash. ACTION_OPEN_DOCUMENT mavjud faylni tanlash uchun tizim tanlovchisini ochadi. ACTION_CREATE_DOCUMENT yangi fayl yaratadi — foydalanuvchi dialogda nom kiritadi, ilova esa yozish uchun URI oladi.
ACTION_OPEN_DOCUMENT_TREE butun katalogni tanlash va undagi barcha fayllarga kirish imkonini beradi. Bu fayl menejerlari, zaxira nusxa ko‘chirish va sinxronizatsiya ilovalarida qo‘llaniladi. Ilova katalog URI sini oladi va DocumentFile orqali tarkibni rekursiv sanab chiqishi mumkin.
| Harakat | Maqsad | Bayroq |
|---|---|---|
| ACTION_OPEN_DOCUMENT | Mavjud faylni tanlash | READ_FLAG |
| ACTION_CREATE_DOCUMENT | Yangi fayl yaratish | WRITE_FLAG |
| ACTION_OPEN_DOCUMENT_TREE | Katalogni tanlash | READ + WRITE |
Har bir harakat uchun MIME turlari EXTRA_MIME_TYPES orqali belgilanadi. Bir nechta turni belgilash mumkin: "application/pdf", "image/*", "text/plain". Turlar belgilanmasa, tanlovchi barcha fayllarni ko‘rsatadi.
Persistent URI permissions — joriy sessiya tugaganidan keyin faylga kirishni saqlashga imkon beruvchi SAF mexanizmi. Bu bayroqsiz URI faqat ilova qayta ishga tushirilguncha amal qiladi. Ilova READ va WRITE bayroqlari bilan birga FLAG_GRANT_PERSISTABLE_URI_PERMISSION bayrog‘ini so‘raydi.
Ruxsatlarni saqlash uchun ContentResolver.takePersistableUriPermission metodi ishlatiladi. Tizim URI ni maxsus reyestrda saqlaydi va ilova keyingi safar ishga tushirilganda kirishni tiklaydi. Ilovaning URI ga doimiy kirishi bor yoki yo‘qligini tekshirish uchun ContentResolver.persistedUriPermissions ishlatiladi.
Foydalanuvchi saqlangan ruxsatlarni Sozlamalar → Ilovalar → Ruxsatlar orqali bekor qilishi mumkin. Ilova faylga kirish kutilmaganda yo‘qolgan stsenariyni boshqarishi kerak. Ishni boshlashdan oldin ContentResolver.openInputStream orqali kirishni tekshirish va SecurityException ni to‘g‘ri boshqarish tavsiya etiladi.
SAF standart Intent orqali ishga tushiriladi. Kod minimal: ACTION_OPEN_DOCUMENT bilan Intent yarating, MIME turlarini belgilang va ActivityResultContracts.StartActivityForResult orqali ishga tushiring. Fayl tanlangandan so‘ng, callback data.data da URI oladi, keyin o‘qish uchun ishlatiladi.
val pickFile = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
result.data?.data?.let { uri ->
val inputStream = contentResolver?.openInputStream(uri)
// read from inputStream
}
}
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
addCategory(Intent.CATEGORY_OPENABLE)
setType("application/pdf")
putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
pickFile.launch(intent)
Yangi fayl yozish uchun ACTION_CREATE_DOCUMENT dan foydalaning. Intent MIME turini va EXTRA_TITLE orqali fayl nomini qabul qiladi. Papka tanlanib tasdiqlangandan so‘ng, foydalanuvchi URI qaytaradi, ilova esa ContentResolver.openOutputStream orqali ma‘lumotlarni yozadi. Tizim tanlangan joyda avtomatik ravishda fayl yaratadi.
SAF an‘anaviy READ_EXTERNAL_STORAGE dan xavfsizlikka tubdan farqli yondashuvi bilan ajralib turadi. Butun xotiraga "bir yo‘la" kirish so‘rash o‘rniga, SAF faqat muayyan faylga kirishni so‘raydi. Bu hujum yuzasini minimallashtiradi va foydalanuvchi ishonchini oshiradi.
READ_EXTERNAL_STORAGE qurilmadagi barcha fayllarga, jumladan boshqa ilovalarning fotosuratlari va hujjatlariga kirish beradi. Android 10+ da bu yondashuv cheklangan. SAF esa faqat foydalanuvchi tanlagan faylga kirishni ta‘minlaydi va har bir fayl uchun aniq tasdiqlashni talab qiladi. Media bilan ommaviy ishlash uchun MediaStore dan, yakka hujjatlar uchun SAF dan foydalaning.
SAF ning asosiy kamchiligi har bir faylni alohida tanlash zarurati. Ommaviy operatsiyalar (zaxira nusxalash, papka sinxronizatsiyasi) uchun tanlangan katalogdagi barcha fayllarga kirish beruvchi ACTION_OPEN_DOCUMENT_TREE ishlatiladi. Yechim stsenariyga bog‘liq: SAF foydalanuvchi tanlovi uchun optimal, MediaStore — media-ga dasturiy kirish uchun.
Tez-tez so‘raladigan savollar
Storage Access Framework — tizim tanlash dialogi orqali fayllarga xavfsiz kirish uchun Android freymvorki. Ilova keng xotirani o‘qish ruxsatlarini so‘ramasdan tanlangan faylga content URI oladi.
ACTION_OPEN_DOCUMENT bilan Intent yarating, setType orqali MIME turini belgilang va ActivityResultContracts orqali ishga tushiring. Callback da data.data dan URI oling va ContentResolver.openInputStream orqali o‘qing.
Persistent URI permissions — ilova qayta ishga tushirilgandan keyin URI ga kirishni saqlash mexanizmi. FLAG_GRANT_PERSISTABLE_URI_PERMISSION bayrog‘i va takePersistableUriPermission metodi orqali so‘raladi.
SAF har qanday MIME turlarini qo‘llab-quvvatlaydi: application/pdf, image/*, text/plain, application/zip va boshqalar. Turlar Intent.putExtra bilan EXTRA_MIME_TYPES massivi orqali belgilanadi.
SAF foydalanuvchi tomonidan tizim dialogi orqali yakka fayllarni tanlash uchun mo‘ljallangan. MediaStore foydalanuvchi ishtirokisiz media bazasi orqali qurilmaning barcha media fayllariga dasturiy kirishni ta‘minlaydi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.