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

वहीं, किसी मीडिया फ़ाइल को बनाने या अपडेट करने के लिए, 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 एपीआई का इस्तेमाल करें.

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

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

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

इस तरीके का इस्तेमाल करें:

  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 डिवाइस के स्टोरेज के बारे में ज़्यादा जानने के लिए, ये लेख पढ़ें:

ब्लॉग पोस्ट