Android, वह फ़ाइल सिस्टम इस्तेमाल करता है जो अन्य प्लैटफ़ॉर्म के, डिस्क पर आधारित फ़ाइल सिस्टम से मेल खाता हो. आपके ऐप्लिकेशन का डेटा सेव करने के लिए, सिस्टम आपको कई विकल्प देता है:
- ऐप्लिकेशन के लिए खास तौर पर बनाया गया स्टोरेज: वे फ़ाइलें सेव करें जो सिर्फ़ आपके ऐप्लिकेशन के इस्तेमाल के लिए बनी हों. इन्हें डिवाइस के स्टोरेज वॉल्यूम में मौजूद खास डायरेक्ट्री या बाहरी स्टोरेज में मौजूद अलग-अलग खास डायरेक्ट्री में सेव किया जा सकता है. संवेदनशील जानकारी को सेव करने के लिए, डिवाइस के स्टोरेज में मौजूद डायरेक्ट्री का इस्तेमाल करें. ऐसा इसलिए, ताकि दूसरे ऐप्लिकेशन इस जानकारी को ऐक्सेस न कर पाएं.
- शेयर किया गया स्टोरेज: वे फ़ाइलें सेव करें जो आपके ऐप्लिकेशन को, अन्य ऐप्लिकेशन के साथ शेयर करनी हो. इनमें मीडिया, दस्तावेज़, और अन्य फ़ाइलें शामिल हैं.
- प्राथमिकताएं: की-वैल्यू पेयर में पुराना, निजी डेटा सेव करें.
- डेटाबेस: Room परसिस्टेंस लाइब्रेरी का इस्तेमाल करके, स्ट्रक्चर्ड डेटा को किसी निजी डेटाबेस में सेव करें.
इन विकल्पों की खास बातों के बारे में यहां दी गई टेबल में बताया गया है:
| कॉन्टेंट किस तरह का है | ऐक्सेस करने का तरीका | अनुमतियां ज़रूरी हैं | क्या अन्य ऐप्लिकेशन इसे ऐक्सेस कर सकते हैं? | क्या ऐप्लिकेशन अनइंस्टॉल करने पर फ़ाइलें हट जाती हैं? | |
|---|---|---|---|---|---|
| ऐप्लिकेशन से जुड़ी फ़ाइलें | ऐसी फ़ाइलें जो सिर्फ़ आपके ऐप्लिकेशन के इस्तेमाल के लिए बनी हों | डिवाइस के स्टोरेज से, getFilesDir() या
getCacheDir()बाहरी स्टोरेज से, getExternalFilesDir() या
getExternalCacheDir() |
डिवाइस के स्टोरेज के लिए कभी ज़रूरी नहीं बाहरी मेमोरी के लिए ज़रूरी नहीं है, जब आपके ऐप्लिकेशन का इस्तेमाल Android 4.4 (एपीआई लेवल 19) या इसके बाद के वर्शन वाले डिवाइसों पर किया जाता है |
नहीं | हां |
| मीडिया | शेयर की जा सकने वाली मीडिया फ़ाइलें (इमेज, ऑडियो फ़ाइलें, वीडियो) | MediaStore एपीआई |
READ_EXTERNAL_STORAGE Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन पर, दूसरे ऐप्लिकेशन की फ़ाइलों को ऐक्सेस करते समयREAD_EXTERNAL_STORAGE या WRITE_EXTERNAL_STORAGE
Android 10 (एपीआई लेवल 29) पर, दूसरे ऐप्लिकेशन की फ़ाइलों को ऐक्सेस करते समयAndroid 9 (एपीआई लेवल 28) या इससे पहले के वर्शन पर, सभी फ़ाइलों को ऐक्सेस करने के लिए अनुमतियां ज़रूरी हैं |
हां, हालांकि दूसरे ऐप्लिकेशन को READ_EXTERNAL_STORAGE की अनुमति चाहिए |
नहीं |
| दस्तावेज़ और अन्य फ़ाइलें | शेयर किए जा सकने वाले अन्य तरह के कॉन्टेंट में, डाउनलोड की गई फ़ाइलें भी शामिल हैं | Storage Access Framework | कोई नहीं | हां, सिस्टम फ़ाइल पिकर के ज़रिए | नहीं |
| ऐप्लिकेशन की प्राथमिकताएं | की-वैल्यू पेयर | Jetpack Preferences लाइब्रेरी | कोई नहीं | नहीं | हां |
| डेटाबेस | स्ट्रक्चर्ड डेटा | Room परसिस्टेंस लाइब्रेरी | कोई नहीं | नहीं | हां |
आपके लिए कौनसा समाधान सही है, यह आपकी ज़रूरतों पर निर्भर करता है:
- आपके डेटा के लिए कितनी जगह की ज़रूरत है?
- डिवाइस के स्टोरेज में, ऐप्लिकेशन के डेटा के लिए सीमित जगह होती है. अगर आपको बहुत ज़्यादा डेटा सेव करना है, तो किसी दूसरे तरह के स्टोरेज का इस्तेमाल करें.
- डेटा का ऐक्सेस कितना भरोसेमंद होना चाहिए?
- अगर आपके ऐप्लिकेशन की बुनियादी सुविधाओं के लिए कुछ डेटा ज़रूरी है, जैसे कि ऐप्लिकेशन शुरू होने पर, तो डेटा को डिवाइस के स्टोरेज डायरेक्ट्री या डेटाबेस में रखें. ऐप्लिकेशन के लिए खास तौर पर बनाई गई फ़ाइलें, बाहरी स्टोरेज में सेव की जाती हैं. हालांकि, इन्हें हमेशा ऐक्सेस नहीं किया जा सकता. ऐसा इसलिए, क्योंकि कुछ डिवाइसों में उपयोगकर्ताओं को बाहरी स्टोरेज से जुड़े फ़िज़िकल डिवाइस को हटाने की अनुमति होती है.
- आपको किस तरह का डेटा सेव करना है?
- अगर आपके पास ऐसा डेटा है जो सिर्फ़ आपके ऐप्लिकेशन के लिए काम का है, तो ऐप्लिकेशन के लिए खास तौर पर बनाए गए स्टोरेज का इस्तेमाल करें. शेयर किए जा सकने वाले मीडिया कॉन्टेंट के लिए, शेयर किए गए स्टोरेज का इस्तेमाल करें, ताकि अन्य ऐप्लिकेशन कॉन्टेंट को ऐक्सेस कर सकें. स्ट्रक्चर्ड डेटा के लिए, प्राथमिकताओं (की-वैल्यू वाले डेटा के लिए) या डेटाबेस (ऐसे डेटा के लिए जिसमें दो से ज़्यादा कॉलम शामिल हैं) का इस्तेमाल करें.
- क्या डेटा को आपके ऐप्लिकेशन के लिए निजी होना चाहिए?
- संवेदनशील डेटा को स्टोर करते समय, डिवाइस के स्टोरेज, प्राथमिकताओं या डेटाबेस का इस्तेमाल करें. यह ऐसा डेटा होता है जिसे किसी अन्य ऐप्लिकेशन से ऐक्सेस नहीं किया जाना चाहिए. डिवाइस के स्टोरेज में सेव किए गए डेटा को उपयोगकर्ताओं से छिपाया जा सकता है.
स्टोरेज की जगहों की कैटगरी
Android में, फ़िज़िकल स्टोरेज की दो तरह की लोकेशन होती हैं: डिवाइस का स्टोरेज और बाहरी स्टोरेज. ज़्यादातर डिवाइसों में, डिवाइस का स्टोरेज, बाहरी स्टोरेज से कम होता है. हालांकि, डिवाइस का स्टोरेज सभी डिवाइसों पर हमेशा उपलब्ध होता है. इसलिए, यह आपके ऐप्लिकेशन के डेटा को सेव करने के लिए ज़्यादा भरोसेमंद जगह है.
एसडी कार्ड जैसे हटाए जा सकने वाले वॉल्यूम, फ़ाइल सिस्टम में बाहरी स्टोरेज के तौर पर दिखते हैं. Android, इन डिवाइसों को पाथ का इस्तेमाल करके दिखाता है. जैसे, /sdcard.
ऐप्लिकेशन डिफ़ॉल्ट रूप से, डिवाइस के स्टोरेज में सेव होते हैं. हालांकि, अगर आपके APK का साइज़ बहुत बड़ा है, तो ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में, ऐप्लिकेशन को बाहरी स्टोरेज पर इंस्टॉल करने के लिए प्राथमिकता सेट की जा सकती है:
<manifest ... android:installLocation="preferExternal"> ... </manifest>
बाहरी स्टोरेज को ऐक्सेस करने की अनुमतियां
Android, स्टोरेज से जुड़ी इन अनुमतियों को तय करता है:
READ_EXTERNAL_STORAGE,
WRITE_EXTERNAL_STORAGE,
और
MANAGE_EXTERNAL_STORAGE.
Android के पुराने वर्शन पर, ऐप्लिकेशन को बाहरी स्टोरेज पर ऐप्लिकेशन के हिसाब से तय की गई डायरेक्ट्री के बाहर मौजूद किसी भी फ़ाइल को ऐक्सेस करने के लिए, READ_EXTERNAL_STORAGE अनुमति का एलान करना होता था.
इसके अलावा, ऐप्लिकेशन को WRITE_EXTERNAL_STORAGE अनुमति के बारे में बताना होगा. यह अनुमति, ऐप्लिकेशन के लिए खास तौर पर बनाई गई डायरेक्ट्री के बाहर मौजूद किसी भी फ़ाइल में लिखने के लिए ज़रूरी होती है.
Android के नए वर्शन में, किसी फ़ाइल को ऐक्सेस करने और उसमें बदलाव करने के लिए ऐप्लिकेशन की क्षमता का पता लगाने के लिए, फ़ाइल की जगह के बजाय उसके मकसद पर ज़्यादा ध्यान दिया जाता है. खास तौर पर, अगर आपका ऐप्लिकेशन Android 11 (एपीआई लेवल 30) या उसके बाद के वर्शन को टारगेट करता है, तो WRITE_EXTERNAL_STORAGE अनुमति का आपके ऐप्लिकेशन के स्टोरेज ऐक्सेस पर कोई असर नहीं पड़ता. इस मॉडल में, स्टोरेज का इस्तेमाल करने के मकसद के आधार पर उपयोगकर्ता की निजता को बेहतर बनाया जाता है. ऐसा इसलिए, क्योंकि ऐप्लिकेशन को डिवाइस के फ़ाइल सिस्टम के सिर्फ़ उन हिस्सों का ऐक्सेस दिया जाता है जिनका वे असल में इस्तेमाल करते हैं.
Android 11 में MANAGE_EXTERNAL_STORAGE अनुमति दी गई है. इससे ऐप्लिकेशन को, ऐप्लिकेशन के लिए खास तौर पर दी गई डायरेक्ट्री और MediaStore के बाहर मौजूद फ़ाइलों में बदलाव करने का ऐक्सेस मिलता है. इस अनुमति के बारे में ज़्यादा जानने के लिए, स्टोरेज डिवाइस पर सभी फ़ाइलें मैनेज करने के तरीके से जुड़ी गाइड देखें. इसमें यह भी बताया गया है कि इस्तेमाल के मामलों को पूरा करने के लिए, ज़्यादातर ऐप्लिकेशन को इस अनुमति के बारे में जानकारी क्यों नहीं देनी पड़ती.
डिवाइस का स्कोप किया गया स्टोरेज
लोगों को उनकी फ़ाइलों पर ज़्यादा कंट्रोल देने और फ़ाइलों को व्यवस्थित रखने के लिए, Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को डिफ़ॉल्ट रूप से, बाहरी स्टोरेज या स्कोप किए गए स्टोरेज का स्कोप किया गया ऐक्सेस दिया जाता है. ऐसे ऐप्लिकेशन को सिर्फ़ बाहरी स्टोरेज पर मौजूद, ऐप्लिकेशन के लिए खास तौर पर दी गई डायरेक्ट्री को ऐक्सेस करने की अनुमति होती है. साथ ही, ऐप्लिकेशन को सिर्फ़ उस तरह के मीडिया को ऐक्सेस करने की अनुमति होती है जिसे उसने बनाया है.
डिवाइस के स्कोप किए गए स्टोरेज का इस्तेमाल करें. ऐसा तब तक करें, जब तक आपके ऐप्लिकेशन को किसी ऐसी फ़ाइल को ऐक्सेस करने की ज़रूरत न हो जो ऐप्लिकेशन के लिए बनी खास डायरेक्ट्री और MediaStore एपीआई के ऐक्सेस वाली डायरेक्ट्री के बाहर सेव की गई हो. अगर आपने ऐप्लिकेशन से जुड़ी फ़ाइलों को बाहरी स्टोरेज में सेव किया है, तो इन फ़ाइलों को बाहरी स्टोरेज में मौजूद ऐप्लिकेशन से जुड़ी डायरेक्ट्री में रखकर, स्कोप किए गए स्टोरेज को आसानी से अपनाया जा सकता है. इस तरह, स्कोप किए गए स्टोरेज की सुविधा चालू होने पर भी, आपका ऐप्लिकेशन इन फ़ाइलों को ऐक्सेस कर पाता है.
अपने ऐप्लिकेशन को डिवाइस के स्कोप किए गए स्टोरेज के लिए तैयार करने के लिए, स्टोरेज के इस्तेमाल के उदाहरण और सबसे सही तरीके वाली गाइड देखें. अगर आपके ऐप्लिकेशन का कोई ऐसा इस्तेमाल का उदाहरण है जो डिवाइस के स्कोप किए गए स्टोरेज के दायरे में नहीं आता है, तो सुविधा का अनुरोध करें. आपके पास स्कोप किए गए स्टोरेज का इस्तेमाल कुछ समय के लिए बंद करने का विकल्प होता है.
किसी डिवाइस पर मौजूद फ़ाइलें देखना
किसी डिवाइस पर सेव की गई फ़ाइलें देखने के लिए, Android Studio के डिवाइस फ़ाइल एक्सप्लोरर का इस्तेमाल करें.
अन्य संसाधन
डेटा स्टोरेज के बारे में ज़्यादा जानने के लिए, यहां दिए गए संसाधन देखें.