उपयोगकर्ताओं को अपनी फ़ाइलों पर ज़्यादा कंट्रोल देने और फ़ाइलें व्यवस्थित रखने के लिए, Android 10 में ऐप्लिकेशन के लिए स्कोप की गई मेमोरी नाम का नया स्टोरेज पैराडाइम पेश किया गया है. स्कोप की गई मेमोरी. स्कोप की गई मेमोरी की मदद से, ऐप्लिकेशन किसी डिवाइस की बाहरी मेमोरी में फ़ाइलें सेव और ऐक्सेस कर सकते हैं. अपने ऐप्लिकेशन को स्कोप की गई मेमोरी के साथ काम करने के लिए माइग्रेट करने में आपकी मदद करने के लिए, इस गाइड में स्टोरेज के सामान्य इस्तेमाल के उदाहरणों के लिए सबसे सही तरीके बताए गए हैं. इस्तेमाल के उदाहरणों को दो कैटगरी में बांटा गया है: मीडिया फ़ाइलों को मैनेज करना और मीडिया के अलावा अन्य फ़ाइलों को मैनेज करना.
कई मामलों में, आपका ऐप्लिकेशन ऐसी फ़ाइलें बनाता है जिन्हें अन्य ऐप्लिकेशन को ऐक्सेस करने की ज़रूरत नहीं होती या जिन्हें ऐक्सेस नहीं करना चाहिए. सिस्टम, ऐसी फ़ाइलों को मैनेज करने के लिए, ऐप्लिकेशन के हिसाब से स्टोरेज की जगहें उपलब्ध कराता है.
Android पर फ़ाइलें सेव और ऐक्सेस करने के तरीके के बारे में ज़्यादा जानने के लिए, स्टोरेज के बारे में ट्रेनिंग देने वाली गाइड देखें.
मीडिया फ़ाइलें मैनेज करना
इस सेक्शन में, मीडिया फ़ाइलों (वीडियो, इमेज, और ऑडियो फ़ाइलें) को मैनेज करने के कुछ सामान्य इस्तेमाल के उदाहरणों के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि आपका ऐप्लिकेशन किस तरीके का इस्तेमाल कर सकता है. यहां दी गई टेबल में, इन सभी इस्तेमाल के उदाहरणों की खास जानकारी दी गई है. साथ ही, इनमें से हर सेक्शन के लिंक भी दिए गए हैं, जिनमें ज़्यादा जानकारी मौजूद है.
| इस्तेमाल का उदाहरण | खास जानकारी |
|---|---|
| सभी इमेज या वीडियो फ़ाइलें दिखाना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| किसी खास फ़ोल्डर से इमेज या वीडियो दिखाना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| फ़ोटो से जगह की जानकारी ऐक्सेस करना | अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल करता है, तो एक तरीका इस्तेमाल करें. अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल नहीं करता है, तो दूसरा तरीका इस्तेमाल करें. |
| नए डाउनलोड के लिए स्टोरेज की जगह तय करना | अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल करता है, तो एक तरीका इस्तेमाल करें. अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल नहीं करता है, तो दूसरा तरीका इस्तेमाल करें. |
| उपयोगकर्ता की मीडिया फ़ाइलें किसी डिवाइस पर एक्सपोर्ट करना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| एक ही कार्रवाई में कई मीडिया फ़ाइलों में बदलाव करना या उन्हें मिटाना | Android 11 के लिए एक तरीका इस्तेमाल करें. Android 10 के लिए, स्कोप की गई मेमोरी का इस्तेमाल न करें. इसके बजाय, Android 9 और इससे पहले के वर्शन के लिए इस्तेमाल किया जाने वाला तरीका अपनाएं. |
| पहले से मौजूद कोई इमेज इंपोर्ट करना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| कोई इमेज कैप्चर करना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| अन्य ऐप्लिकेशन के साथ मीडिया फ़ाइलें शेयर करना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| किसी खास ऐप्लिकेशन के साथ मीडिया फ़ाइलें शेयर करना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| कोड या लाइब्रेरी से फ़ाइलें ऐक्सेस करना . इनमें फ़ाइल पाथ का सीधे तौर पर इस्तेमाल किया जाता है | Android 11 के लिए एक तरीका इस्तेमाल करें. Android 10 के लिए, स्कोप की गई मेमोरी का इस्तेमाल न करें. इसके बजाय, Android 9 और इससे पहले के वर्शन के लिए इस्तेमाल किया जाने वाला तरीका अपनाएं. |
एक से ज़्यादा फ़ोल्डर से इमेज या वीडियो फ़ाइलें दिखाना
मीडिया कलेक्शन के लिए क्वेरी करें
query() एपीआई का इस्तेमाल करके. मीडिया फ़ाइलों को फ़िल्टर या क्रम से लगाने के लिए, projection, selection,
selectionArgs, और sortOrder पैरामीटर में बदलाव करें.
किसी खास फ़ोल्डर से इमेज या वीडियो दिखाना
यह तरीका अपनाएं:
- ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों के मुताबिक, ऐप्लिकेशन की अनुमतियों का अनुरोध करना,
READ_EXTERNAL_STORAGEअनुमति का अनुरोध करें. -
MediaColumns.DATAकी वैल्यू के आधार पर मीडिया फ़ाइलें वापस पाएं, इसमें डिस्क पर मौजूद मीडिया आइटम का ऐब्सलूट फ़ाइल सिस्टम पाथ होता है.
ध्यान दें: मौजूदा मीडिया फ़ाइल को ऐक्सेस करते समय, अपने लॉजिक में DATA कॉलम की वैल्यू का इस्तेमाल किया जा सकता है. ऐसा इसलिए, क्योंकि इस वैल्यू में मान्य फ़ाइल पाथ होता है.
हालांकि, यह न मान लें कि फ़ाइल हमेशा उपलब्ध रहेगी. फ़ाइल से जुड़ी I/O की किसी भी गड़बड़ी को ठीक करने के लिए तैयार रहें.
इसके उलट, मीडिया फ़ाइल बनाने या अपडेट करने के लिए, DATA कॉलम का इस्तेमाल न करें. इसके बजाय, DISPLAY_NAME और
RELATIVE_PATH कॉलम का इस्तेमाल करें.
फ़ोटो से जगह की जानकारी ऐक्सेस करना
अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल करता है, तो मीडिया स्टोरेज गाइड के फ़ोटो में जगह की जानकारी सेक्शन में दिया गया तरीका अपनाएं.
MediaStore
नए डाउनलोड के लिए स्टोरेज की जगह तय करना
अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल करता है, तो डाउनलोड की गई मीडिया फ़ाइलों को सेव करने के लिए चुनी गई जगह का ध्यान रखें.
अगर अन्य ऐप्लिकेशन को फ़ाइलों का ऐक्सेस चाहिए, तो डाउनलोड या दस्तावेज़ कलेक्शन के लिए, अच्छी तरह से तय किए गए मीडिया कलेक्शन का इस्तेमाल करें.
Android 11 और इसके बाद के वर्शन पर, ऐप्लिकेशन के लिए खास तौर पर बनाई गई बाहरी डायरेक्ट्री में मौजूद फ़ाइलें, अन्य ऐप्लिकेशन के लिए उपलब्ध नहीं होती हैं. भले ही, इन फ़ाइलों को फ़ेच करने के लिए DownloadManager का इस्तेमाल किया गया हो.
उपयोगकर्ता की मीडिया फ़ाइलें किसी डिवाइस पर एक्सपोर्ट करना
उपयोगकर्ता की मीडिया फ़ाइलें सेव करने के लिए, डिफ़ॉल्ट तौर पर कोई सही जगह तय करें:
- उपयोगकर्ताओं को यह चुनने की अनुमति दें कि उन्हें ऐप्लिकेशन के लिए खास तौर पर बनाए गए स्टोरेज या शेयर किए गए स्टोरेज का इस्तेमाल करके, अपनी मीडिया फ़ाइलों को अन्य ऐप्लिकेशन के लिए पढ़ने की अनुमति देनी है या नहीं .
- उपयोगकर्ताओं को ऐप्लिकेशन के लिए खास तौर पर बनाई गई डायरेक्ट्री से, आम तौर पर ऐक्सेस की जा सकने वाली किसी जगह पर फ़ाइलें एक्सपोर्ट करने की अनुमति दें. मीडिया फ़ाइलों को डिवाइस की गैलरी में एक्सपोर्ट करने के लिए, MediaStore के इमेज, वीडियो, और ऑडियो कलेक्शन का इस्तेमाल करें.
एक ही कार्रवाई में कई मीडिया फ़ाइलों में बदलाव करना या उन्हें मिटाना
अपने ऐप्लिकेशन के Android वर्शन के हिसाब से लॉजिक शामिल करें.
Android 11 पर चल रहा है
यह तरीका अपनाएं:
- `MediaStore.createWriteRequest()` या `MediaStore.createTrashRequest()` का इस्तेमाल करके, अपने ऐप्लिकेशन के लिखने या मिटाने के अनुरोध के लिए, पेंडिंग इंटेंट बनाएं. इसके बाद, उस इंटेंट को लागू करके, उपयोगकर्ताओं से फ़ाइलों के सेट में बदलाव करने की अनुमति मांगें.
MediaStore.createWriteRequest()MediaStore.createTrashRequest() उपयोगकर्ता के जवाब का आकलन करें:
- अगर अनुमति दी गई है, तो बदलाव करने या मिटाने की कार्रवाई जारी रखें.
- अगर अनुमति नहीं दी गई है, तो उपयोगकर्ता को बताएं कि आपके ऐप्लिकेशन में इस सुविधा के लिए अनुमति की ज़रूरत क्यों है.
Android 11 और इसके बाद के वर्शन पर उपलब्ध इन तरीकों का इस्तेमाल करके, मीडिया फ़ाइलों के ग्रुप को मैनेज करने के बारे में ज़्यादा जानें फ़ाइलें.
Android 10 पर चल रहा है
अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) को टारगेट करता है, तो इस कार्रवाई को करने के लिए, स्कोप की गई मेमोरी का इस्तेमाल न करें. इसके बजाय, Android 9 और इससे पहले के वर्शन के लिए इस्तेमाल किया जाने वाला तरीका अपनाएं.
Android 9 या इससे पहले के वर्शन पर चल रहा है
यह तरीका अपनाएं:
- ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों के मुताबिक,
अनुमति का अनुरोध करें.
WRITE_EXTERNAL_STORAGE - मीडिया फ़ाइलों में बदलाव करने या उन्हें मिटाने के लिए,
MediaStoreएपीआई का इस्तेमाल करें.
पहले से मौजूद कोई इमेज इंपोर्ट करना
जब आपको पहले से मौजूद कोई इमेज इंपोर्ट करनी हो (उदाहरण के लिए, उपयोगकर्ता की प्रोफ़ाइल के लिए फ़ोटो के तौर पर इस्तेमाल करने के लिए), तो आपका ऐप्लिकेशन इस कार्रवाई के लिए अपना यूज़र इंटरफ़ेस (यूआई) इस्तेमाल कर सकता है. इसके अलावा, सिस्टम पिकर का इस्तेमाल भी किया जा सकता है.
अपना यूज़र इंटरफ़ेस (यूआई) दिखाना
यह तरीका अपनाएं:
- ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों के मुताबिक, ऐप्लिकेशन की अनुमतियों का अनुरोध करना,
READ_EXTERNAL_STORAGEअनुमति का अनुरोध करें. - मीडिया कलेक्शन के लिए क्वेरी करने के लिए,
query()API का इस्तेमाल करें. - नतीजों को अपने ऐप्लिकेशन के कस्टम यूआई में दिखाएं.
सिस्टम पिकर का इस्तेमाल करना
ACTION_GET_CONTENT
इंटेंट का इस्तेमाल करें. इससे उपयोगकर्ता से इंपोर्ट करने के लिए कोई इमेज चुनने के लिए कहा जाता है.
अगर आपको उन इमेज के टाइप फ़िल्टर करने हैं जिन्हें सिस्टम पिकर, उपयोगकर्ता को चुनने के लिए दिखाता है, तो
का इस्तेमाल किया जा सकता है
setType()
या EXTRA_MIME_TYPES.
कोई इमेज कैप्चर करना
जब आपको अपने ऐप्लिकेशन में इस्तेमाल करने के लिए कोई इमेज कैप्चर करनी हो (उदाहरण के लिए, उपयोगकर्ता की प्रोफ़ाइल के लिए फ़ोटो के तौर पर इस्तेमाल करने के लिए), तो ACTION_IMAGE_CAPTURE इंटेंट का इस्तेमाल करें. इससे उपयोगकर्ता से डिवाइस के कैमरे का इस्तेमाल करके फ़ोटो लेने के लिए कहा जाता है. सिस्टम, कैप्चर की गई फ़ोटो को
MediaStore.Images टेबल में सेव करता है.
अन्य ऐप्लिकेशन के साथ मीडिया फ़ाइलें शेयर करना
MediaStore में सीधे तौर पर रिकॉर्ड जोड़ने के लिए,
insert()
तरीके का इस्तेमाल करें. ज़्यादा जानकारी के लिए, मीडिया स्टोरेज गाइड का कोई आइटम जोड़ना सेक्शन देखें.
किसी खास ऐप्लिकेशन के साथ मीडिया फ़ाइलें शेयर करना
Android के FileProvider कॉम्पोनेंट का इस्तेमाल करें. इसके बारे में, फ़ाइल शेयर करने की सुविधा सेट अप करना गाइड में बताया गया है.
कोड या लाइब्रेरी से फ़ाइलें ऐक्सेस करना. इनमें फ़ाइल पाथ का सीधे तौर पर इस्तेमाल किया जाता है
अपने ऐप्लिकेशन के Android वर्शन के हिसाब से लॉजिक शामिल करें.
Android 11 पर चल रहा है
यह तरीका अपनाएं:
- ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों के मुताबिक, ऐप्लिकेशन की अनुमतियों का अनुरोध करना,
READ_EXTERNAL_STORAGEअनुमति का अनुरोध करें. - फ़ाइल पाथ का सीधे तौर पर इस्तेमाल करके, फ़ाइलें ऐक्सेस करें.
Android 10 पर चल रहा है
अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) को टारगेट करता है, तो इस कार्रवाई को करने के लिए, स्कोप की गई मेमोरी का इस्तेमाल न करें. इसके बजाय, Android 9 और इससे पहले के वर्शन के लिए इस्तेमाल किया जाने वाला तरीका अपनाएं.
Android 9 या इससे पहले के वर्शन पर चल रहा है
यह तरीका अपनाएं:
- ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों के मुताबिक,
अनुमति का अनुरोध करें.
WRITE_EXTERNAL_STORAGE - फ़ाइल पाथ का सीधे तौर पर इस्तेमाल करके, फ़ाइलें ऐक्सेस करें.
मीडिया के अलावा अन्य फ़ाइलें मैनेज करना
इस सेक्शन में, मीडिया के अलावा अन्य फ़ाइलों को मैनेज करने के कुछ सामान्य इस्तेमाल के उदाहरणों के बारे में बताया गया है. साथ ही, यह भी बताया गया है कि आपका ऐप्लिकेशन किस तरीके का इस्तेमाल कर सकता है. यहां दी गई टेबल में, इन सभी इस्तेमाल के उदाहरणों की खास जानकारी दी गई है. साथ ही, इनमें से हर सेक्शन के लिंक भी दिए गए हैं, जिनमें ज़्यादा जानकारी मौजूद है.
| इस्तेमाल का उदाहरण | खास जानकारी |
|---|---|
| कोई दस्तावेज़ वाली फ़ाइल खोलना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| सेकंडरी स्टोरेज वॉल्यूम पर मौजूद फ़ाइलों में लिखना | Android 11 के लिए एक तरीका इस्तेमाल करें. Android के पुराने वर्शन के लिए दूसरा तरीका इस्तेमाल करें. |
| पहले से मौजूद फ़ाइलों को लेगसी स्टोरेज की जगह से माइग्रेट करना | जब भी मुमकिन हो, अपनी फ़ाइलों को स्कोप की गई मेमोरी में माइग्रेट करें. ज़रूरत पड़ने पर, Android 10 के लिए स्कोप की गई मेमोरी का इस्तेमाल न करें. |
| अन्य ऐप्लिकेशन के साथ कॉन्टेंट शेयर करना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| मीडिया के अलावा अन्य फ़ाइलों को कैश मेमोरी में सेव करना | Android के सभी वर्शन के लिए एक ही तरीका इस्तेमाल करें. |
| मीडिया के अलावा अन्य फ़ाइलों को किसी डिवाइस पर एक्सपोर्ट करना | अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल करता है, तो एक तरीका इस्तेमाल करें. अगर आपका ऐप्लिकेशन स्कोप की गई मेमोरी का इस्तेमाल नहीं करता है, तो दूसरा तरीका इस्तेमाल करें. |
कोई दस्तावेज़ वाली फ़ाइल खोलना
ACTION_OPEN_DOCUMENT
इंटेंट का इस्तेमाल करें. इससे उपयोगकर्ता से सिस्टम पिकर का इस्तेमाल करके खोलने के लिए कोई फ़ाइल चुनने के लिए कहा जाता है. अगर आपको उन फ़ाइलों के टाइप फ़िल्टर करने हैं जिन्हें सिस्टम पिकर, उपयोगकर्ता को चुनने के लिए दिखाएगा, तो setType() या EXTRA_MIME_TYPES का इस्तेमाल किया जा सकता है.
उदाहरण के लिए, यहां दिए गए कोड का इस्तेमाल करके, सभी पीडीएफ़, ओडीटी, और टीएक्सटी फ़ाइलें ढूंढी जा सकती हैं:
Kotlin
startActivityForResult( Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "*/*" putExtra(Intent.EXTRA_MIME_TYPES, arrayOf( "application/pdf", // .pdf "application/vnd.oasis.opendocument.text", // .odt "text/plain" // .txt )) }, REQUEST_CODE )
Java
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[] { "application/pdf", // .pdf "application/vnd.oasis.opendocument.text", // .odt "text/plain" // .txt }); startActivityForResult(intent, REQUEST_CODE);
सेकंडरी स्टोरेज वॉल्यूम पर मौजूद फ़ाइलों में लिखना
सेकंडरी स्टोरेज वॉल्यूम में एसडी कार्ड शामिल होते हैं. किसी स्टोरेज वॉल्यूम के बारे में जानकारी ऐक्सेस करने के लिए,
का इस्तेमाल किया जा सकता है.
StorageVolume
अपने ऐप्लिकेशन के Android वर्शन के हिसाब से लॉजिक शामिल करें.
Android 11 पर चल रहा है
यह तरीका अपनाएं:
- स्कोप की गई मेमोरी मॉडल का इस्तेमाल करें.
- Android 10 (एपीआई लेवल 29) या इससे पहले के वर्शन को टारगेट करें.
-
WRITE_EXTERNAL_STORAGEअनुमति की जानकारी दें. - इनमें से किसी एक तरह का ऐक्सेस दें:
MediaStoreएपीआई का इस्तेमाल करके, फ़ाइल ऐक्सेस करना.-
Fileयाfopen()जैसे एपीआई का इस्तेमाल करके, फ़ाइल पाथ का सीधे तौर पर ऐक्सेस.
पुराने वर्शन पर चल रहा है
पहले से मौजूद फ़ाइलों को लेगसी स्टोरेज की जगह से माइग्रेट करना
किसी डायरेक्ट्री को लेगसी स्टोरेज की जगह तब माना जाता है, जब वह ऐप्लिकेशन के लिए खास तौर पर बनाई गई डायरेक्ट्री या सार्वजनिक तौर पर शेयर की गई डायरेक्ट्री न हो. अगर आपका ऐप्लिकेशन, लेगसी स्टोरेज की जगह पर फ़ाइलें बनाता है या उनका इस्तेमाल करता है, तो हमारा सुझाव है कि अपने ऐप्लिकेशन की फ़ाइलों को उन जगहों पर माइग्रेट करें जिन्हें स्कोप की गई मेमोरी से ऐक्सेस किया जा सकता है. साथ ही, स्कोप की गई मेमोरी में मौजूद फ़ाइलों के साथ काम करने के लिए, ऐप्लिकेशन में ज़रूरी बदलाव करें.
डेटा माइग्रेशन के लिए, लेगसी स्टोरेज की जगह का ऐक्सेस बनाए रखना
आपके ऐप्लिकेशन को, लेगसी स्टोरेज की जगह का ऐक्सेस बनाए रखना होगा, ताकि ऐप्लिकेशन की किसी भी फ़ाइल को उन जगहों पर माइग्रेट किया जा सके जिन्हें स्कोप की गई मेमोरी से ऐक्सेस किया जा सकता है. आपको किस तरीके का इस्तेमाल करना चाहिए, यह आपके ऐप्लिकेशन के टारगेट एपीआई लेवल पर निर्भर करता है.
अगर आपका ऐप्लिकेशन Android 11 को टारगेट करता है
लेगसी स्टोरेज मॉडल को बनाए रखने के लिए,
preserveLegacyExternalStorageफ़्लैग कोtrueपर सेट करें. इससे, जब उपयोगकर्ता आपके ऐप्लिकेशन के नए वर्शन पर अपग्रेड करेंगे, तो आपका ऐप्लिकेशन उनका डेटा माइग्रेट कर सकेगा. यह नया वर्शन, Android 11 को टारगेट करता है.
अगर आपका ऐप्लिकेशन Android 10 को टारगेट करता है
स्कोप की गई मेमोरी का इस्तेमाल न करें, ताकि Android के अलग-अलग वर्शन पर आपके ऐप्लिकेशन के व्यवहार को बनाए रखना आसान हो.
ऐप्लिकेशन का डेटा माइग्रेट करना
जब आपका ऐप्लिकेशन माइग्रेट करने के लिए तैयार हो जाए, तो यह तरीका अपनाएं:
- Android 10 या इससे पहले के वर्शन को टारगेट करें.
- स्कोप की गई मेमोरी का इस्तेमाल न करें, ताकि आपके ऐप्लिकेशन को उन फ़ाइलों का ऐक्सेस मिल सके जिन्हें आपको माइग्रेट करना है.
-
ऐसा कोड डिप्लॉय करें जो
Fileएपीआई का इस्तेमाल करके, फ़ाइलों को उनकी मौजूदा जगह/sdcard/से, स्कोप की गई मेमोरी से ऐक्सेस की जा सकने वाली किसी जगह पर ले जाए:- ऐप्लिकेशन की सभी निजी फ़ाइलों को उस डायरेक्ट्री में ले जाएं जो
getExternalFilesDir()तरीके से मिलती है. - शेयर की गई सभी फ़ाइलों को
डायरेक्ट्री की, ऐप्लिकेशन के लिए खास तौर पर बनाई गई सबडायरेक्ट्री में ले जाएं.
Downloads/
- ऐप्लिकेशन की सभी निजी फ़ाइलों को उस डायरेक्ट्री में ले जाएं जो
- अपने ऐप्लिकेशन की लेगसी स्टोरेज डायरेक्ट्री को
/sdcard/डायरेक्ट्री से हटाएं.
उपयोगकर्ता, आपके ऐप्लिकेशन का नया वर्शन इंस्टॉल करने के बाद, अपने डिवाइसों पर डेटा माइग्रेशन की प्रोसेस पूरी करते हैं. Analytics इवेंट बनाकर, अपने उपयोगकर्ता आधार पर माइग्रेशन की प्रोसेस की निगरानी की जा सकती है.
उपयोगकर्ताओं के डेटा माइग्रेट करने के बाद, अपने ऐप्लिकेशन के लिए एक और अपडेट पब्लिश करें. इसमें Android 11 को टारगेट करें.
अन्य ऐप्लिकेशन के साथ कॉन्टेंट शेयर करना
अपने ऐप्लिकेशन की फ़ाइलों को किसी एक अन्य ऐप्लिकेशन के साथ शेयर करने के लिए, use a
FileProvider. ऐसे ऐप्लिकेशन के लिए जिन्हें एक-दूसरे के साथ फ़ाइलें शेयर करनी हैं, हमारा सुझाव है कि हर ऐप्लिकेशन के लिए कॉन्टेंट प्रोवाइडर का इस्तेमाल करें. इसके बाद, कलेक्शन में ऐप्लिकेशन जोड़े जाने पर डेटा सिंक करें.
मीडिया के अलावा अन्य फ़ाइलों को कैश मेमोरी में सेव करना
आपको किस तरीके का इस्तेमाल करना चाहिए, यह इस बात पर निर्भर करता है कि आपको किस तरह की फ़ाइलें कैश मेमोरी में सेव करनी हैं.
- छोटी फ़ाइलें या संवेदनशील जानकारी वाली फ़ाइलें:
Context#getCacheDir()का इस्तेमाल करें. - बड़ी फ़ाइलें या ऐसी फ़ाइलें जिनमें संवेदनशील जानकारी नहीं है: इस्तेमाल करें
Context#getExternalCacheDir().
मीडिया के अलावा अन्य फ़ाइलों को किसी डिवाइस पर एक्सपोर्ट करना
मीडिया के अलावा अन्य फ़ाइलें सेव करने के लिए, डिफ़ॉल्ट तौर पर कोई सही जगह तय करें. उपयोगकर्ताओं को ऐप्लिकेशन के लिए खास तौर पर बनाई गई डायरेक्ट्री से, आम तौर पर ऐक्सेस की जा सकने वाली किसी जगह पर फ़ाइलें एक्सपोर्ट करने की अनुमति दें. मीडिया के अलावा अन्य फ़ाइलों को डिवाइस पर एक्सपोर्ट करने के लिए, MediaStore के डाउनलोड या दस्तावेज़ कलेक्शन का इस्तेमाल करें.
ऐप्लिकेशन के लिए खास तौर पर बनाई गई फ़ाइलें मैनेज करना
डिवाइस के स्टोरेज की डायरेक्ट्री
सिस्टम, अन्य ऐप्लिकेशन को इन जगहों को ऐक्सेस करने से रोकता है. साथ ही, Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन पर, इन जगहों को एन्क्रिप्ट किया जाता है. ये जगहें, संवेदनशील डेटा सेव करने के लिए सही हैं. इन्हें सिर्फ़ आपका ऐप्लिकेशन ऐक्सेस कर सकता है.
बाहरी स्टोरेज की डायरेक्ट्री
अगर डिवाइस के स्टोरेज में, ऐप्लिकेशन के लिए खास तौर पर बनाई गई फ़ाइलें सेव करने के लिए ज़रूरी जगह नहीं है, तो इसके बजाय बाहरी स्टोरेज का इस्तेमाल करें. हालांकि, अगर किसी अन्य ऐप्लिकेशन के पास सही अनुमतियां हैं, तो वह इन डायरेक्ट्री को ऐक्सेस कर सकता है . इन डायरेक्ट्री में सेव की गई फ़ाइलें सिर्फ़ आपके ऐप्लिकेशन के इस्तेमाल के लिए होती हैं.
Android 4.4 (एपीआई लेवल 19) या इसके बाद के वर्शन पर, आपके ऐप्लिकेशन को बाहरी स्टोरेज में, ऐप्लिकेशन के लिए खास तौर पर बनाई गई डायरेक्ट्री को ऐक्सेस करने के लिए, स्टोरेज से जुड़ी किसी भी अनुमति का अनुरोध करने की ज़रूरत नहीं होती.
जब उपयोगकर्ता आपके ऐप्लिकेशन को अनइंस्टॉल करते हैं, तो ऐप्लिकेशन के लिए खास तौर पर बनाए गए स्टोरेज में सेव की गई फ़ाइलें हटा दी जाती हैं. इसलिए, इस स्टोरेज का इस्तेमाल ऐसी किसी भी चीज़ को सेव करने के लिए नहीं करना चाहिए जिसे उपयोगकर्ता आपके ऐप्लिकेशन से अलग बनाए रखना चाहते हैं.
स्कोप की गई मेमोरी का इस्तेमाल न करना
जब तक आपका ऐप्लिकेशन, स्कोप की गई मेमोरी के साथ पूरी तरह से काम नहीं करता, तब तक टेस्ट और प्रोडक्शन ऐप्लिकेशन, दोनों में स्कोप की गई मेमोरी का इस्तेमाल न करें.
टेस्ट में स्कोप की गई मेमोरी का इस्तेमाल न करना
Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन पर, आपके ऐप्लिकेशन के टेस्ट डिफ़ॉल्ट रूप से स्टोरेज सैंडबॉक्स में चलते हैं. यह सैंडबॉक्स, आपके ऐप्लिकेशन को ऐप्लिकेशन के लिए खास तौर पर बनाई गई डायरेक्ट्री और सार्वजनिक तौर पर शेयर की गई डायरेक्ट्री के बाहर मौजूद फ़ाइलें ऐक्सेस करने से रोकता है.
अगर कोई टेस्ट, होस्ट के लिए फ़ाइलें आउटपुट करता है—जैसे, स्क्रीनशॉट, डीबग करने का डेटा, कवरेज डेटा या परफ़ॉर्मेंस मेट्रिक—तो इन फ़ाइलों को ग्लोबल डायरेक्ट्री में सेव किया जा सकता है. ऐसा करने के लिए, am instrument को लागू करने वाले, काम के हार्नेस में यह फ़्लैग जोड़ें:
-e no-isolated-storage 1
यह फ़्लैग, इंस्ट्रूमेंट किए गए टेस्ट केस के सभी व्यवहार पर असर डालता है. साथ ही, यह लागू किए गए सभी टेस्ट कोड पर भी असर डालता है. इसलिए, इस फ़्लैग का इस्तेमाल करने पर, यह पुष्टि नहीं की जा सकती कि आपका ऐप्लिकेशन स्कोप की गई मेमोरी के साथ काम करता है या नहीं. टेस्ट के आउटपुट के लिए, ऐप्लिकेशन के स्कोप की गई मेमोरी में सेव करना बेहतर है. इसे शेल से पढ़ा जा सकता है. इसके बाद, ऐप्लिकेशन के स्कोप की गई डायरेक्ट्री को पुल किया जा सकता है. यह पता करने के लिए कि किस डायरेक्ट्री से पुल करना है, कॉल करें
getExternalMediaDirs().
प्रोडक्शन ऐप्लिकेशन में स्कोप की गई मेमोरी का इस्तेमाल न करना
अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) या इससे पहले के वर्शन को टारगेट करता है, तो अपने प्रोडक्शन ऐप्लिकेशन में स्कोप की गई मेमोरी का इस्तेमाल न करें. हालांकि, अगर Android 10 को टारगेट किया जाता है, तो अपने ऐप्लिकेशन की मेनिफ़ेस्ट फ़ाइल में requestLegacyExternalStorage की वैल्यू को true पर सेट करना होगा:
<manifest ... > <!-- This attribute is "false" by default on apps targeting Android 10. --> <application android:requestLegacyExternalStorage="true" ... > ... </application> </manifest>
यह टेस्ट करने के लिए कि Android 10 या इससे पहले के वर्शन को टारगेट करने वाला कोई ऐप्लिकेशन, स्कोप की गई मेमोरी का इस्तेमाल करते समय कैसा काम करता है, requestLegacyExternalStorage की वैल्यू को false पर सेट करके, इस व्यवहार के लिए ऑप्ट-इन किया जा सकता है. अगर Android 11 पर चलने वाले किसी डिवाइस पर टेस्ट किया जा रहा है, तो ऐप्लिकेशन की स्कोप की गई मेमोरी के साथ या उसके बिना काम करने के तरीके को टेस्ट करने के लिए, ऐप्लिकेशन की कंपैटिबिलिटी फ़्लैग का भी इस्तेमाल किया जा सकता है.
अन्य संसाधन
Android स्टोरेज के बारे में ज़्यादा जानने के लिए, यह कॉन्टेंट देखें: