Android डिवाइस में स्टोरेज के इस्तेमाल के उदाहरण और सबसे सही तरीके

उपयोगकर्ताओं को उनकी फ़ाइलों का ज़्यादा कंट्रोल देने और फ़ाइलों को व्यवस्थित रखने के लिए, 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 पैरामीटर में बदलाव करें.

किसी फ़ोल्डर की इमेज या वीडियो दिखाना

यह तरीका अपनाएं:

  1. ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों का पालन करके, READ_EXTERNAL_STORAGE अनुमति का अनुरोध करें.
  2. MediaColumns.DATA की वैल्यू के आधार पर मीडिया फ़ाइलें वापस पाएं. इसमें डिस्क पर मौजूद मीडिया आइटम का ऐब्सलूट फ़ाइल सिस्टम पाथ होता है.

ध्यान दें: किसी मौजूदा मीडिया फ़ाइल को ऐक्सेस करते समय, अपने लॉजिक में DATA कॉलम की वैल्यू का इस्तेमाल किया जा सकता है. ऐसा इसलिए है, क्योंकि इस वैल्यू में फ़ाइल का मान्य पाथ मौजूद है. हालांकि, यह न मान लें कि फ़ाइल हमेशा उपलब्ध रहेगी. फ़ाइल से जुड़ी किसी भी I/O गड़बड़ी को ठीक करने के लिए तैयार रहें.

मीडिया फ़ाइल बनाने या उसे अपडेट करने के लिए, DATA कॉलम का इस्तेमाल न करें. इसके बजाय, DISPLAY_NAME और RELATIVE_PATH कॉलम का इस्तेमाल करें.

फ़ोटो से जगह की जानकारी ऐक्सेस करना

अगर आपका ऐप्लिकेशन स्कोप किए गए स्टोरेज का इस्तेमाल करता है, तो मीडिया स्टोरेज गाइड के फ़ोटोग्राफ़ में जगह की जानकारी सेक्शन में दिया गया तरीका अपनाएं.

नए डाउनलोड के लिए स्टोरेज की जगह तय करना

अगर आपका ऐप्लिकेशन स्कोप्ड स्टोरेज का इस्तेमाल करता है, तो डाउनलोड की गई मीडिया फ़ाइलों को सेव करने के लिए जगह चुनते समय सावधानी बरतें.

अगर अन्य ऐप्लिकेशन को फ़ाइलों का ऐक्सेस चाहिए, तो डाउनलोड या दस्तावेज़ों के कलेक्शन के लिए, अच्छी तरह से तय किए गए मीडिया कलेक्शन का इस्तेमाल करें.

Android 11 और इसके बाद के वर्शन पर, ऐप्लिकेशन के हिसाब से बाहरी डायरेक्ट्री में मौजूद फ़ाइलों को अन्य ऐप्लिकेशन ऐक्सेस नहीं कर सकते. भले ही, इन फ़ाइलों को फ़ेच करने के लिए DownloadManager का इस्तेमाल किया गया हो.

उपयोगकर्ता की मीडिया फ़ाइलों को किसी डिवाइस पर एक्सपोर्ट करना

उपयोगकर्ता की मीडिया फ़ाइलों को सेव करने के लिए, सही डिफ़ॉल्ट जगह तय करें:

एक ही बार में कई मीडिया फ़ाइलों में बदलाव करना या उन्हें मिटाना

Android के उन वर्शन के हिसाब से लॉजिक शामिल करें जिन पर आपका ऐप्लिकेशन काम करता है.

Android 11 पर चल रहा है

यह तरीका अपनाएं:

  1. MediaStore.createWriteRequest() या MediaStore.createTrashRequest() का इस्तेमाल करके, अपने ऐप्लिकेशन के लिखने या मिटाने के अनुरोध के लिए एक पेंडिंग इंटेंट बनाएं. इसके बाद, उस इंटेंट को लागू करके, उपयोगकर्ता से फ़ाइलों के सेट में बदलाव करने की अनुमति मांगें.
  2. उपयोगकर्ता के जवाब का आकलन करें:

    • अगर अनुमति मिल गई है, तो बदलाव करने या मिटाने की कार्रवाई जारी रखें.
    • अगर अनुमति नहीं दी गई है, तो उपयोगकर्ता को बताएं कि आपके ऐप्लिकेशन में इस सुविधा के लिए अनुमति क्यों ज़रूरी है.

Android 11 और इसके बाद के वर्शन पर उपलब्ध इन तरीकों का इस्तेमाल करके, मीडिया फ़ाइलों के ग्रुप मैनेज करने के बारे में ज़्यादा जानें.

Android 10 पर चल रहा हो

अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) को टारगेट करता है, तो इस कार्रवाई को पूरा करने के लिए, स्कोप किए गए स्टोरेज से ऑप्ट-आउट करें और Android 9 या इससे पहले के वर्शन के लिए इस्तेमाल किए जाने वाले तरीके का इस्तेमाल जारी रखें.

Android 9 या इससे पहले के वर्शन पर चल रहा हो

यह तरीका अपनाएं:

  1. ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों का पालन करके, WRITE_EXTERNAL_STORAGE अनुमति का अनुरोध करें.
  2. मीडिया फ़ाइलों में बदलाव करने या उन्हें मिटाने के लिए, MediaStore API का इस्तेमाल करें.

पहले से मौजूद किसी एक इमेज को इंपोर्ट करना

जब आपको पहले से मौजूद कोई एक इमेज इंपोर्ट करनी हो (उदाहरण के लिए, किसी उपयोगकर्ता की प्रोफ़ाइल फ़ोटो के तौर पर इस्तेमाल करने के लिए), तो आपका ऐप्लिकेशन इस कार्रवाई के लिए, अपने यूज़र इंटरफ़ेस (यूआई) का इस्तेमाल कर सकता है. इसके अलावा, सिस्टम पिकर का भी इस्तेमाल किया जा सकता है.

अपना यूज़र इंटरफ़ेस दिखाना

यह तरीका अपनाएं:

  1. ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों का पालन करके, READ_EXTERNAL_STORAGE अनुमति का अनुरोध करें.
  2. मीडिया कलेक्शन के बारे में क्वेरी करने के लिए, query() एपीआई का इस्तेमाल करें.
  3. अपने ऐप्लिकेशन के कस्टम यूज़र इंटरफ़ेस (यूआई) में नतीजे दिखाएं.

सिस्टम पिकर का इस्तेमाल करना

ACTION_GET_CONTENT इंटेंट का इस्तेमाल करें. इससे उपयोगकर्ता को इंपोर्ट करने के लिए कोई इमेज चुनने के लिए कहा जाता है.

अगर आपको यह फ़िल्टर करना है कि सिस्टम पिकर, उपयोगकर्ता को किस तरह की इमेज चुनने के लिए दिखाए, तो setType() या EXTRA_MIME_TYPES का इस्तेमाल करें.

एक इमेज कैप्चर करना

जब आपको अपने ऐप्लिकेशन में इस्तेमाल करने के लिए कोई इमेज कैप्चर करनी हो (उदाहरण के लिए, किसी उपयोगकर्ता की प्रोफ़ाइल फ़ोटो के तौर पर इस्तेमाल करने के लिए), तो ACTION_IMAGE_CAPTURE इंटेंट का इस्तेमाल करें. इससे उपयोगकर्ता को डिवाइस के कैमरे का इस्तेमाल करके फ़ोटो लेने के लिए कहा जा सकेगा. सिस्टम, कैप्चर की गई फ़ोटो को MediaStore.Images टेबल में सेव करता है.

अन्य ऐप्लिकेशन के साथ मीडिया फ़ाइलें शेयर करना

MediaStore में सीधे रिकॉर्ड जोड़ने के लिए, insert() तरीके का इस्तेमाल करें. ज़्यादा जानकारी के लिए, मीडिया स्टोरेज गाइड में कोई आइटम जोड़ना सेक्शन देखें.

किसी ऐप्लिकेशन के साथ मीडिया फ़ाइलें शेयर करना

फ़ाइल शेयर करने की सुविधा सेट अप करना गाइड में बताए गए तरीके से, Android FileProvider कॉम्पोनेंट का इस्तेमाल करें.

ऐसे कोड या लाइब्रेरी से फ़ाइलें ऐक्सेस करना जो फ़ाइल के सीधे पाथ का इस्तेमाल करते हैं

Android के उन वर्शन के हिसाब से लॉजिक शामिल करें जिन पर आपका ऐप्लिकेशन काम करता है.

Android 11 पर चल रहा है

यह तरीका अपनाएं:

  1. ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों का पालन करके, READ_EXTERNAL_STORAGE अनुमति का अनुरोध करें.
  2. फ़ाइल के पाथ का इस्तेमाल करके, फ़ाइलों को ऐक्सेस करें.

ज़्यादा जानकारी के लिए, फ़ाइल के डायरेक्ट पाथ का इस्तेमाल करके मीडिया फ़ाइलें खोलने का तरीका देखें.

Android 10 पर चल रहा हो

अगर आपका ऐप्लिकेशन Android 10 (एपीआई लेवल 29) को टारगेट करता है, तो इस कार्रवाई को पूरा करने के लिए, स्कोप किए गए स्टोरेज से ऑप्ट-आउट करें और Android 9 या इससे पहले के वर्शन के लिए इस्तेमाल किए जाने वाले तरीके का इस्तेमाल जारी रखें.

Android 9 या इससे पहले के वर्शन पर चल रहा हो

यह तरीका अपनाएं:

  1. ऐप्लिकेशन की अनुमतियों का अनुरोध करना लेख में बताए गए सबसे सही तरीकों का पालन करके, WRITE_EXTERNAL_STORAGE अनुमति का अनुरोध करें.
  2. फ़ाइल के पाथ का इस्तेमाल करके, फ़ाइलों को ऐक्सेस करें.

मीडिया फ़ाइलों के अलावा अन्य फ़ाइलों को मैनेज करना

इस सेक्शन में, मीडिया से जुड़ी नहीं हैं ऐसी फ़ाइलों को मैनेज करने के कुछ सामान्य उदाहरण दिए गए हैं. साथ ही, इसमें उस हाई-लेवल अप्रोच के बारे में बताया गया है जिसका इस्तेमाल आपका ऐप्लिकेशन कर सकता है. यहां दी गई टेबल में, इस्तेमाल के इन सभी उदाहरणों के बारे में खास जानकारी दी गई है. साथ ही, ज़्यादा जानकारी वाले हर सेक्शन के लिंक भी दिए गए हैं.

इस्तेमाल का उदाहरण खास जानकारी
कोई दस्तावेज़ फ़ाइल खोलना 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 पर चल रहा है

यह तरीका अपनाएं:

  1. स्कोप किए गए स्टोरेज मॉडल का इस्तेमाल करें.
  2. Android 10 (एपीआई लेवल 29) या इससे पहले के वर्शन को टारगेट करता हो.
  3. WRITE_EXTERNAL_STORAGE अनुमति की जानकारी दें.
  4. इनमें से किसी एक तरह का ऐक्सेस दें:
    • MediaStore एपीआई का इस्तेमाल करके फ़ाइल ऐक्सेस करना.
    • File या fopen() जैसे एपीआई का इस्तेमाल करके, फ़ाइल के पाथ को सीधे तौर पर ऐक्सेस करना.

पुराने वर्शन पर काम करना

स्टोरेज ऐक्सेस फ़्रेमवर्क का इस्तेमाल करें. इससे लोगों को सेकंडरी स्टोरेज वॉल्यूम पर वह जगह चुनने की अनुमति मिलती है जहां आपका ऐप्लिकेशन फ़ाइल लिख सकता है.

लेगसी स्टोरेज की जगह से मौजूदा फ़ाइलों को माइग्रेट करना

अगर कोई डायरेक्ट्री, ऐप्लिकेशन के हिसाब से बनाई गई डायरेक्ट्री या सार्वजनिक तौर पर शेयर की गई डायरेक्ट्री नहीं है, तो उसे लेगसी स्टोरेज लोकेशन माना जाता है. अगर आपका ऐप्लिकेशन, लेगसी स्टोरेज की किसी जगह पर फ़ाइलें बनाता है या उनका इस्तेमाल करता है, तो हमारा सुझाव है कि आप अपने ऐप्लिकेशन की फ़ाइलों को ऐसी जगहों पर माइग्रेट करें जिन्हें स्कोप किए गए स्टोरेज से ऐक्सेस किया जा सकता है. साथ ही, स्कोप किए गए स्टोरेज में मौजूद फ़ाइलों के साथ काम करने के लिए, ऐप्लिकेशन में ज़रूरी बदलाव करें.

डेटा माइग्रेट करने के लिए, लेगसी स्टोरेज की जगह का ऐक्सेस बनाए रखना

आपके ऐप्लिकेशन को लेगसी स्टोरेज की जगह का ऐक्सेस बनाए रखना होगा, ताकि वह किसी भी ऐप्लिकेशन की फ़ाइलों को स्कोप किए गए स्टोरेज की मदद से ऐक्सेस की जा सकने वाली जगहों पर माइग्रेट कर सके. आपको किस तरीके का इस्तेमाल करना चाहिए, यह आपके ऐप्लिकेशन के टारगेट एपीआई लेवल पर निर्भर करता है.

अगर आपका ऐप्लिकेशन Android 11 को टारगेट करता है
  1. लेगसी स्टोरेज मॉडल को बनाए रखने के लिए, preserveLegacyExternalStorage फ़्लैग को true पर सेट करें. इससे, जब कोई उपयोगकर्ता Android 11 को टारगेट करने वाले आपके ऐप्लिकेशन के नए वर्शन पर अपग्रेड करेगा, तब आपका ऐप्लिकेशन उसके डेटा को माइग्रेट कर पाएगा.

  2. स्कोप किए गए स्टोरेज से ऑप्ट आउट करें, ताकि आपका ऐप्लिकेशन Android 10 डिवाइसों पर, लेगसी स्टोरेज की जगह में मौजूद आपकी फ़ाइलों को ऐक्सेस कर सके.

अगर आपका ऐप्लिकेशन Android 10 को टारगेट करता है

स्कोप किए गए स्टोरेज से ऑप्ट आउट करें, ताकि Android के अलग-अलग वर्शन पर आपके ऐप्लिकेशन के व्यवहार को बनाए रखना आसान हो.

ऐप्लिकेशन का डेटा माइग्रेट करना

जब आपका ऐप्लिकेशन माइग्रेट करने के लिए तैयार हो जाए, तो यह तरीका अपनाएं:

  1. ऐप्लिकेशन, Android 10 या इससे पहले के वर्शन पर काम करता हो.
  2. स्कोप किए गए स्टोरेज से ऑप्ट आउट करें, ताकि आपके ऐप्लिकेशन के पास उन फ़ाइलों का ऐक्सेस हो जिन्हें आपको माइग्रेट करना है.
  3. ऐसा कोड डिप्लॉय करें जो File एपीआई का इस्तेमाल करके, फ़ाइलों को /sdcard/ में मौजूद उनकी मौजूदा जगह से ऐसी जगह पर ले जाए जहां स्कोप किए गए स्टोरेज का इस्तेमाल करके उन फ़ाइलों को ऐक्सेस किया जा सकता है:

    1. निजी ऐप्लिकेशन की किसी भी फ़ाइल को उस डायरेक्ट्री में ले जाएं जिसे getExternalFilesDir() तरीके से वापस लाया गया है.
    2. शेयर की गई किसी भी नॉन-मीडिया फ़ाइल को Downloads/ डायरेक्ट्री की ऐप्लिकेशन के लिए तय की गई सबडायरेक्ट्री में ले जाएं.
  4. अपने ऐप्लिकेशन की लेगसी स्टोरेज डायरेक्ट्री को /sdcard/ डायरेक्ट्री से हटाएं.

उपयोगकर्ता, आपके ऐप्लिकेशन का नया वर्शन इंस्टॉल करने के बाद, अपने डिवाइसों पर डेटा माइग्रेट करने की प्रोसेस पूरी करते हैं. विश्लेषण इवेंट बनाकर, अपने उपयोगकर्ता आधार पर माइग्रेशन की प्रोसेस को मॉनिटर किया जा सकता है.

उपयोगकर्ताओं के डेटा माइग्रेट करने के बाद, अपने ऐप्लिकेशन का एक और अपडेट पब्लिश करें. इसमें 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 के स्टोरेज के बारे में ज़्यादा जानने के लिए, यहां दिया गया कॉन्टेंट देखें:

ब्लॉग पोस्ट