Android, वह फ़ाइल सिस्टम इस्तेमाल करता है जो अन्य प्लैटफ़ॉर्म के, डिस्क पर आधारित फ़ाइल सिस्टम से मेल खाता हो. आपके ऐप्लिकेशन का डेटा सेव करने के लिए, सिस्टम आपको कई विकल्प देता है:
- ऐप्लिकेशन के लिए स्टोरेज: सिर्फ़ आपके ऐप्लिकेशन के इस्तेमाल के लिए बनी फ़ाइलों को, इंटरनल स्टोरेज वॉल्यूम में मौजूद खास डायरेक्ट्री में या बाहरी स्टोरेज में मौजूद अलग-अलग डायरेक्ट्री में सेव करें. ऐसी संवेदनशील जानकारी सेव करने के लिए डिवाइस के स्टोरेज में मौजूद डायरेक्ट्री का इस्तेमाल करें जिसे दूसरे ऐप्लिकेशन को ऐक्सेस न करना हो.
- शेयर किया गया स्टोरेज: वे फ़ाइलें सेव करें जो आपके ऐप्लिकेशन को, अन्य ऐप्लिकेशन के साथ शेयर करनी हो. इनमें मीडिया, दस्तावेज़, और अन्य फ़ाइलें शामिल हैं.
- प्राथमिकताएं: की-वैल्यू पेयर में पुराना, निजी डेटा सेव करें.
- डेटाबेस: रूम परसिस्टेंस लाइब्रेरी का इस्तेमाल करके स्ट्रक्चर्ड डेटा को किसी निजी डेटाबेस में सेव करें.
इन विकल्पों की खास बातों के बारे में नीचे दी गई टेबल में बताया गया है:
कॉन्टेंट किस तरह का है | ऐक्सेस करने का तरीका | अनुमतियां ज़रूरी हैं | क्या दूसरे ऐप्लिकेशन ऐक्सेस कर सकते हैं? | ऐप्लिकेशन अनइंस्टॉल करने पर फ़ाइलें हटाई गईं? | |
---|---|---|---|---|---|
ऐप्लिकेशन के हिसाब से फ़ाइलें | सिर्फ़ आपके ऐप्लिकेशन के इस्तेमाल के लिए बनी फ़ाइलें | डिवाइस के स्टोरेज से, 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
अनुमति की ज़रूरत है |
नहीं |
दस्तावेज़ और अन्य फ़ाइलें | शेयर किया जा सकने वाला अन्य कॉन्टेंट, जिसमें डाउनलोड की गई फ़ाइलें भी शामिल हैं | स्टोरेज ऐक्सेस फ़्रेमवर्क | कोई नहीं | हां, सिस्टम फ़ाइल पिकर की मदद से | नहीं |
ऐप्लिकेशन की प्राथमिकताएं | की-वैल्यू पेयर | Jetpack की प्राथमिकताएं लाइब्रेरी | कोई नहीं | नहीं | हां |
डेटाबेस | स्ट्रक्चर्ड डेटा | 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 के डिवाइस फ़ाइल एक्सप्लोरर का इस्तेमाल करें.
अन्य संसाधन
डेटा स्टोरेज के बारे में ज़्यादा जानने के लिए, यहां दिए गए संसाधन देखें.