Storage Access Framework ایک Android فریم ورک ہے جو سسٹم سلیکشن ڈائیلاگ کے ذریعے فائلوں اور دستاویزات تک محفوظ رسائی فراہم کرتا ہے۔ اسٹوریج پڑھنے کی وسیع اجازتیں مانگنے کے بجائے، ایپ صارف کے منتخب کردہ فائل کا URI لنک حاصل کرتی ہے۔ Android Developers (2026) کے مطابق، SAF DocumentProvider کے ذریعے مقامی اسٹوریج، کلاؤڈ سروسز Google Drive اور Dropbox کو سپورٹ کرتا ہے۔ یہ فریم ورک Android 4.4 میں متعارف کرایا گیا اور Android 10 سے دستاویزات کے ساتھ کام کرنے کا معیار بن گیا۔
اہم نکات
Storage Access Framework Android SDK کا ایک حصہ ہے جو سسٹم ڈائیلاگ کے ذریعے دستاویزات کو منتخب کرنے اور بنانے کے لیے ایک متحد انٹرفیس فراہم کرتا ہے۔ SAF فائلوں کے فزیکل مقام کو چھپاتا ہے: ایپ نہیں جانتی کہ فائل کہاں سے پڑھی جا رہی ہے — مقامی ڈسک، Google Drive یا Dropbox۔
SAF فن تعمیر میں تین اجزاء شامل ہیں: کلائنٹ ایپ جو درخواست شروع کرتی ہے، سسٹم پیکر — ایک معیاری فائل سلیکشن ڈائیلاگ، اور DocumentProvider — ایک مواد فراہم کنندہ جو کسی مخصوص اسٹوریج کی فائلوں تک رسائی کو نافذ کرتا ہے۔ صارف ڈیٹا کے منبع سے قطع نظر ایک متحد انٹرفیس دیکھتا ہے۔
SAF Android 4.4 (API 19) سے دستیاب ہے۔ ابتدائی طور پر فریم ورک صرف دستاویزات کو سپورٹ کرتا تھا، لیکن Android 5.0 نے ACTION_OPEN_DOCUMENT_TREE کے ذریعے ڈائریکٹریز کی سپورٹ شامل کی۔ Android 10 سے، SAF ایپ کے مخصوص اسٹوریج سے باہر کسی بھی فائل تک رسائی کا تجویز کردہ طریقہ بن گیا۔
SAF ACTION_OPEN_DOCUMENT ایکشن کے ساتھ Intent کے ذریعے سسٹم فائل سلیکشن ڈائیلاگ شروع کرتا ہے۔ صارف دستیاب ذرائع کی فہرست دیکھتا ہے: اندرونی اسٹوریج، Google Drive، Dropbox اور دیگر رجسٹرڈ فراہم کنندگان۔ فائل منتخب کرنے کے بعد، سسٹم عارضی رسائی کے حقوق کے ساتھ content URI لوٹاتا ہے۔
content URI کا فارمیٹ content://com.android.externalstorage.documents/document/primary/Download/file.pdf ہے۔ file:// URI کے برعکس، content URI حقیقی فائل پاتھ ظاہر نہیں کرتا اور DocumentProvider کے ذریعے کام کرتا ہے۔ ایپ حاصل کردہ URI استعمال کرتے ہوئے ContentResolver.openInputStream کے ذریعے فائل پڑھتی ہے۔
سسٹم پیکر خود بخود MIME اقسام کے لحاظ سے فائلوں کی تلاش، ترتیب اور فلٹرنگ کو سپورٹ کرتا ہے۔ ڈویلپر Intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "image/*")) کے ذریعے مطلوبہ اقسام کی وضاحت کرتا ہے، اور پیکر صرف متعلقہ فائلیں دکھاتا ہے۔
ڈیفالٹ طور پر، URI ایپ کے دوبارہ شروع ہونے یا ڈیوائس کے ریبوٹ ہونے تک درست ہوتا ہے۔ طویل مدتی رسائی کے لیے، ایپ takePersistableUriPermission کی درخواست کرتی ہے — یہ ڈائیلاگ کے ذریعے دوبارہ انتخاب کیے بغیر بعد کے لانچوں پر فائل پڑھنے کی اجازت دیتا ہے۔
SAF فائلوں کے ساتھ کام کرنے کے لیے تین اہم ایکشنز فراہم کرتا ہے: کھولنا، بنانا اور فولڈر ٹری منتخب کرنا۔ ACTION_OPEN_DOCUMENT موجودہ فائل منتخب کرنے کے لیے سسٹم پیکر کھولتا ہے۔ ACTION_CREATE_DOCUMENT ایک نئی فائل بناتا ہے — صارف ڈائیلاگ میں نام درج کرتا ہے، اور ایپ لکھنے کے لیے URI حاصل کرتی ہے۔
ACTION_OPEN_DOCUMENT_TREE پوری ڈائریکٹری منتخب کرنے اور اس کے اندر تمام فائلوں تک رسائی حاصل کرنے کی اجازت دیتا ہے۔ یہ فائل مینیجرز، بیک اپ اور سنکرونائزیشن ایپس میں استعمال ہوتا ہے۔ ایپ ڈائریکٹری URI حاصل کرتی ہے اور DocumentFile کے ذریعے مواد کو بار بار شمار کر سکتی ہے۔
| ایکشن | مقصد | پرچم |
|---|---|---|
| ACTION_OPEN_DOCUMENT | موجودہ فائل منتخب کریں | READ_FLAG |
| ACTION_CREATE_DOCUMENT | نئی فائل بنائیں | WRITE_FLAG |
| ACTION_OPEN_DOCUMENT_TREE | ڈائریکٹری منتخب کریں | READ + WRITE |
ہر ایکشن کے لیے، MIME اقسام EXTRA_MIME_TYPES کے ذریعے مخصوص کی جاتی ہیں۔ متعدد اقسام مخصوص کی جا سکتی ہیں: "application/pdf"، "image/*"، "text/plain"۔ اگر کوئی قسم مخصوص نہیں کی گئی، پیکر تمام فائلیں دکھاتا ہے۔
Persistent URI permissions ایک SAF میکانزم ہے جو موجودہ سیشن ختم ہونے کے بعد فائل تک رسائی برقرار رکھنے کی اجازت دیتا ہے۔ اس پرچم کے بغیر، URI صرف ایپ کے دوبارہ شروع ہونے تک درست ہوتا ہے۔ ایپ READ اور WRITE پرچموں کے ساتھ FLAG_GRANT_PERSISTABLE_URI_PERMISSION پرچم کی درخواست کرتی ہے۔
اجازتیں محفوظ کرنے کے لیے ContentResolver.takePersistableUriPermission طریقہ استعمال کیا جاتا ہے۔ سسٹم URI کو ایک خصوصی رجسٹری میں محفوظ کرتا ہے اور اگلی ایپ لانچ پر رسائی بحال کرتا ہے۔ یہ چیک کرنے کے لیے کہ آیا ایپ کے پاس URI تک مستقل رسائی ہے، ContentResolver.persistedUriPermissions استعمال کیا جاتا ہے۔
صارف سیٹنگز → ایپس → اجازتیں کے ذریعے محفوظ کردہ اجازتیں منسوخ کر سکتا ہے۔ ایپ کو اس منظر نامے کو ہینڈل کرنا چاہیے جب فائل تک رسائی غیر متوقع طور پر ختم ہو جائے۔ کام شروع کرنے سے پہلے ContentResolver.openInputStream کے ذریعے رسائی چیک کرنے اور SecurityException کو صحیح طریقے سے ہینڈل کرنے کی سفارش کی جاتی ہے۔
SAF ایک معیاری Intent کے ذریعے شروع کیا جاتا ہے۔ کوڈ کم سے کم ہے: ACTION_OPEN_DOCUMENT کے ساتھ Intent بنائیں، MIME اقسام مخصوص کریں، اور ActivityResultContracts.StartActivityForResult کے ذریعے شروع کریں۔ فائل منتخب کرنے کے بعد، callback data.data میں URI حاصل کرتا ہے، جو پھر پڑھنے کے لیے استعمال ہوتا ہے۔
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 استعمال کریں۔ Intent MIME قسم اور EXTRA_TITLE کے ذریعے فائل کا نام قبول کرتا ہے۔ فولڈر منتخب کرنے اور تصدیق کرنے کے بعد، صارف ایک URI لوٹاتا ہے جس میں ایپ ContentResolver.openOutputStream کے ذریعے ڈیٹا لکھتی ہے۔ سسٹم خود بخود منتخب مقام پر فائل بناتا ہے۔
SAF روایتی READ_EXTERNAL_STORAGE سے حفاظت کے حوالے سے بنیادی طور پر مختلف نقطہ نظر میں مختلف ہے۔ ایک بار میں پورے اسٹوریج تک رسائی کی درخواست کرنے کے بجائے، SAF صرف ایک مخصوص فائل تک رسائی کی درخواست کرتا ہے۔ یہ حملے کی سطح کو کم کرتا ہے اور صارف کا اعتماد بڑھاتا ہے۔
READ_EXTERNAL_STORAGE ڈیوائس پر تمام فائلوں تک رسائی دیتا ہے، بشمول دیگر ایپس کی تصاویر اور دستاویزات۔ Android 10+ پر، یہ نقطہ نظر محدود ہے۔ اس کے برعکس، SAF صرف صارف کے منتخب کردہ فائل تک رسائی فراہم کرتا ہے اور ہر فائل کے لیے واضح تصدیق کی ضرورت ہوتی ہے۔ بیچ میڈیا آپریشنز کے لیے MediaStore استعمال کریں، انفرادی دستاویزات کے لیے SAF استعمال کریں۔
SAF کا بنیادی نقصان ہر فائل کو انفرادی طور پر منتخب کرنے کی ضرورت ہے۔ بڑے پیمانے پر آپریشنز (بیک اپ، فولڈر سنکرونائزیشن) کے لیے، ACTION_OPEN_DOCUMENT_TREE استعمال کیا جاتا ہے، جو منتخب ڈائریکٹری میں تمام فائلوں تک رسائی دیتا ہے۔ حل منظر نامے پر منحصر ہے: SAF صارف کے انتخاب کے لیے بہترین ہے، MediaStore پروگراماتی میڈیا تک رسائی کے لیے۔
اکثر پوچھے گئے سوالات
Storage Access Framework ایک Android فریم ورک ہے جو سسٹم سلیکشن ڈائیلاگ کے ذریعے محفوظ فائل تک رسائی کے لیے ہے۔ ایپ اسٹوریج پڑھنے کی وسیع اجازتیں مانگے بغیر منتخب فائل کے لیے content URI حاصل کرتی ہے۔
ACTION_OPEN_DOCUMENT کے ساتھ Intent بنائیں، setType کے ذریعے MIME قسم بتائیں، اور ActivityResultContracts کے ذریعے شروع کریں۔ Callback میں، data.data سے URI حاصل کریں اور ContentResolver.openInputStream کے ذریعے پڑھیں۔
Persistent URI permissions ایپ کے دوبارہ شروع ہونے کے بعد URI تک رسائی برقرار رکھنے کا ایک طریقہ کار ہے۔ یہ FLAG_GRANT_PERSISTABLE_URI_PERMISSION پرچم اور takePersistableUriPermission طریقہ کے ذریعے درخواست کیا جاتا ہے۔
SAF کسی بھی MIME قسم کو سپورٹ کرتا ہے: application/pdf، image/*، text/plain، application/zip اور دیگر۔ اقسام EXTRA_MIME_TYPES صف کے ساتھ Intent.putExtra کے ذریعے مخصوص کی جاتی ہیں۔
SAF صارف کے ذریعے سسٹم ڈائیلاگ کے ذریعے انفرادی فائلیں منتخب کرنے کے لیے ڈیزائن کیا گیا ہے۔ MediaStore صارف کی مداخلت کے بغیر میڈیا ڈیٹا بیس کے ذریعے ڈیوائس پر تمام میڈیا فائلوں تک پروگراماتی رسائی فراہم کرتا ہے۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں