उपयोगकर्ताओं को उनकी फ़ाइलों पर ज़्यादा कंट्रोल देने और फ़ाइलों को व्यवस्थित रखने के लिए, 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
कॉलम का इस्तेमाल करें.
फ़ोटो से जगह की जानकारी ऐक्सेस करना
अगर आपका ऐप्लिकेशन स्कोप वाले स्टोरेज का इस्तेमाल करता है, तो मीडिया स्टोरेज गाइड के फ़ोटोग्राफ़ में दी गई जगह की जानकारी सेक्शन में दिया गया तरीका अपनाएं.
नए डाउनलोड के लिए स्टोरेज की जगह तय करना
अगर आपका ऐप्लिकेशन स्कोप वाले स्टोरेज का इस्तेमाल करता है, तो ध्यान रखें कि डाउनलोड की जाने वाली मीडिया फ़ाइलों को सेव करने के लिए जगह की जानकारी सही हो.
अगर अन्य ऐप्लिकेशन को फ़ाइलों का ऐक्सेस चाहिए, तो डाउनलोड या दस्तावेज़ों के कलेक्शन के लिए, साफ़ तौर पर तय किए गए मीडिया कलेक्शन का इस्तेमाल करें.
Android 11 और उसके बाद के वर्शन पर, ऐप्लिकेशन के हिसाब से बनाई गई बाहरी डायरेक्ट्री में मौजूद फ़ाइलों को अन्य ऐप्लिकेशन ऐक्सेस नहीं कर सकते. भले ही, इन फ़ाइलों को फ़ेच करने के लिए DownloadManager
का इस्तेमाल किया जा रहा हो.
उपयोगकर्ता की मीडिया फ़ाइलों को किसी डिवाइस पर एक्सपोर्ट करना
उपयोगकर्ता की मीडिया फ़ाइलों को सेव करने के लिए, डिफ़ॉल्ट तौर पर कोई सही जगह तय करें:
- उपयोगकर्ताओं को यह चुनने की अनुमति दें कि ऐप्लिकेशन के लिए खास तौर पर उपलब्ध स्टोरेज या शेयर किए गए स्टोरेज का इस्तेमाल करके, उनकी मीडिया फ़ाइलों को दूसरे ऐप्लिकेशन पढ़ पाएं या नहीं.
- उपयोगकर्ताओं को ऐप्लिकेशन के हिसाब से बनाई गई डायरेक्ट्री से, ऐसी जगह पर फ़ाइलें एक्सपोर्ट करने की अनुमति दें जहां उन्हें आसानी से ऐक्सेस किया जा सके. मीडिया फ़ाइलों को डिवाइस की गैलरी में एक्सपोर्ट करने के लिए, MediaStore की इमेज, वीडियो, और ऑडियो कलेक्शन का इस्तेमाल करें.
एक ही कार्रवाई में कई मीडिया फ़ाइलों में बदलाव करना या उन्हें मिटाना
उन Android वर्शन के आधार पर लॉजिक शामिल करें जिन पर आपका ऐप्लिकेशन काम करता है.
Android 11 पर चल रहा हो
इस तरीके का इस्तेमाल करें:
MediaStore.createWriteRequest()
याMediaStore.createTrashRequest()
का इस्तेमाल करके, अपने ऐप्लिकेशन के लिखने या मिटाने के अनुरोध के लिए, एक पेंडिंग इंटेंट बनाएं. इसके बाद, उस इंटेंट को ट्रिगर करके, उपयोगकर्ता से फ़ाइलों के किसी सेट में बदलाव करने की अनुमति मांगें.उपयोगकर्ता के जवाब का आकलन करें:
- अगर अनुमति मिल गई है, तो बदलाव करने या मिटाने की कार्रवाई जारी रखें.
- अगर अनुमति नहीं दी गई है, तो उपयोगकर्ता को बताएं कि आपके ऐप्लिकेशन की सुविधा को अनुमति क्यों चाहिए.
Android 11 और उसके बाद के वर्शन पर उपलब्ध इन तरीकों का इस्तेमाल करके, मीडिया फ़ाइलों के ग्रुप मैनेज करने के बारे में ज़्यादा जानें.
Android 10 पर चल रहा हो
अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) को टारगेट करता है, तो स्कोप किए गए स्टोरेज से ऑप्ट-आउट करें. साथ ही, इस कार्रवाई को करने के लिए, Android 9 और उससे पहले के वर्शन के लिए इस्तेमाल किए जाने वाले तरीके का इस्तेमाल जारी रखें.
Android 9 या इससे पहले के वर्शन पर काम करता हो
इस तरीके का इस्तेमाल करें:
- ऐप्लिकेशन की अनुमतियों का अनुरोध करें में बताए गए सबसे सही तरीकों का पालन करके,
WRITE_EXTERNAL_STORAGE
अनुमति का अनुरोध करें. - मीडिया फ़ाइलों में बदलाव करने या उन्हें मिटाने के लिए,
MediaStore
एपीआई का इस्तेमाल करें.
पहले से मौजूद कोई इमेज इंपोर्ट करना
अगर आपको पहले से मौजूद किसी इमेज को इंपोर्ट करना है, तो आपका ऐप्लिकेशन इस काम के लिए अपने यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल कर सकता है. इसके अलावा, वह सिस्टम पिकर का भी इस्तेमाल कर सकता है. उदाहरण के लिए, उपयोगकर्ता की प्रोफ़ाइल फ़ोटो के तौर पर इस्तेमाल करने के लिए.
अपना यूज़र इंटरफ़ेस दिखाना
इस तरीके का इस्तेमाल करें:
- ऐप्लिकेशन की अनुमतियों का अनुरोध करें में बताए गए सबसे सही तरीकों का पालन करके,
READ_EXTERNAL_STORAGE
अनुमति का अनुरोध करें. - किसी मीडिया कलेक्शन के लिए क्वेरी करने के लिए,
query()
एपीआई का इस्तेमाल करें. - नतीजों को अपने ऐप्लिकेशन के पसंद के मुताबिक बनाए गए यूज़र इंटरफ़ेस (यूआई) में दिखाएं.
सिस्टम पिकर का इस्तेमाल करना
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
का इस्तेमाल करें.
उदाहरण के लिए, इस कोड का इस्तेमाल करके सभी PDF, ODT, और TXT फ़ाइलें ढूंढी जा सकती हैं:
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 10 को टारगेट करता है
स्कोप वाले स्टोरेज से ऑप्ट आउट करें, ताकि Android के सभी वर्शन पर अपने ऐप्लिकेशन के व्यवहार को आसानी से मैनेज किया जा सके.
ऐप्लिकेशन का डेटा माइग्रेट करें
जब आपका ऐप्लिकेशन माइग्रेट करने के लिए तैयार हो, तो यह तरीका अपनाएं:
- Android 10 या इससे पहले के वर्शन को टारगेट करें.
- स्कोप वाले स्टोरेज से ऑप्ट आउट करें, ताकि आपके ऐप्लिकेशन के पास उन फ़ाइलों का ऐक्सेस हो जिन्हें माइग्रेट करना है.
-
File
एपीआई का इस्तेमाल करके, फ़ाइलों को/sdcard/
में मौजूद उनकी मौजूदा जगह से, ऐसी जगह पर ले जाने के लिए कोड डिप्लॉय करें जहां उन्हें स्कोप वाले स्टोरेज से ऐक्सेस किया जा सकता है:- किसी भी निजी ऐप्लिकेशन फ़ाइल को उस डायरेक्ट्री में ले जाएं जो
getExternalFilesDir()
तरीके से मिलती है. - शेयर की गई ऐसी फ़ाइलों को
Downloads/
डायरेक्ट्री की, ऐप्लिकेशन के लिए बनाई गई सबडायरेक्ट्री में ले जाएं जो मीडिया फ़ाइलें नहीं हैं.
- किसी भी निजी ऐप्लिकेशन फ़ाइल को उस डायरेक्ट्री में ले जाएं जो
/sdcard/
डायरेक्ट्री से, अपने ऐप्लिकेशन की लेगसी स्टोरेज डायरेक्ट्री हटाएं.
जब उपयोगकर्ता आपके ऐप्लिकेशन का नया वर्शन इंस्टॉल करते हैं, तब वे अपने डिवाइसों पर डेटा माइग्रेशन की प्रक्रिया पूरी करते हैं. Analytics इवेंट बनाकर, अपने पूरे उपयोगकर्ता आधार में माइग्रेशन की प्रोसेस को मॉनिटर किया जा सकता है.
उपयोगकर्ताओं के डेटा को माइग्रेट करने के बाद, अपने ऐप्लिकेशन में एक और अपडेट पब्लिश करें. इसमें, Android 11 को टारगेट करें.
दूसरे ऐप्लिकेशन के साथ कॉन्टेंट शेयर करना
अपने ऐप्लिकेशन की फ़ाइलों को किसी एक ऐप्लिकेशन के साथ शेयर करने के लिए, 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 स्टोरेज के बारे में ज़्यादा जानकारी के लिए, ये लेख पढ़ें: