Storage Access Framework: bu nima, ishlash tamoyillari va fayllarga kirish

Muallif: IT Sectr Nashr etilgan: 2026-07-10 O'qish vaqti: 6 daq

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

  • SAF — keng ruxsatlarsiz tizim dialogi orqali fayl tanlash uchun Android freymvorki.
  • URI-havola to‘g‘ridan-to‘g‘ri fayl yo‘lini almashtiradi: ilova content URI orqali fayl bilan ishlaydi.
  • Persistent permissions ilova qayta ishga tushirilgandan keyin faylga kirishni saqlashga imkon beradi.
  • DocumentProvider SAFni bulut va maxsus omborlarga kirish uchun kengaytiradi.
  • Android 10 SAFni ilova sandboxidan tashqari fayllarga kirish uchun majburiy qildi.

Storage Access Framework nima?

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 qanday ishlaydi: tizim tanlovchisi va URI

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.

URI kirishining hayot aylanishi

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.

ACTION_OPEN_DOCUMENT va ACTION_CREATE_DOCUMENT

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.

HarakatMaqsadBayroq
ACTION_OPEN_DOCUMENTMavjud faylni tanlashREAD_FLAG
ACTION_CREATE_DOCUMENTYangi fayl yaratishWRITE_FLAG
ACTION_OPEN_DOCUMENT_TREEKatalogni tanlashREAD + 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

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.

Kod namunalari: SAF orqali fayl tanlash

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.

kotlin
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)

ACTION_CREATE_DOCUMENT orqali fayl yaratish

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 vs READ_EXTERNAL_STORAGE

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

Android da Storage Access Framework nima?

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.

SAF orqali faylni qanday ochish mumkin?

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 nima?

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 qanday MIME turlarini qo‘llab-quvvatlaydi?

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 ning MediaStore dan farqi nimada?

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

  • Storage Access Framework — keng ruxsatlarsiz tizim tanlovchisi orqali fayllarga xavfsiz kirish uchun Android freymvorki.
  • Content URI fayl yo‘llarini almashtiradi: ilova to‘g‘ridan-to‘g‘ri file:// havolalar orqali emas, balki DocumentProvider orqali fayl bilan ishlaydi.
  • ACTION_OPEN_DOCUMENT mavjud faylni ochadi, ACTION_CREATE_DOCUMENT yangisini yaratadi, ACTION_OPEN_DOCUMENT_TREE papkani tanlaydi.
  • Persistent permissions takePersistableUriPermission orqali ilova qayta ishga tushirilgandan keyin URI ga kirishni saqlaydi.
  • Android 10 SAFni app-specific storage dan tashqari fayllarga kirish uchun majburiy qildi, READ_EXTERNAL_STORAGE ni chekladi.
  • DocumentProvider SAFni bulut va maxsus omborlarni integratsiyalash uchun kengaytiradi.
  • Tanlov SAF va MediaStore o‘rtasida stsenariyga bog‘liq: SAF — foydalanuvchi tanlovi uchun, MediaStore — media-ga dasturiy kirish uchun.

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.

Loyihani muhokama qilish

Shuningdek o'qing