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