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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें