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 एपीआई का इस्तेमाल करें.

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

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

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

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

  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. फ़ाइलों को /sdcard/ के तहत उनकी मौजूदा जगह से ऐसी जगह पर ले जाने के लिए File एपीआई का इस्तेमाल करने वाले कोड को डिप्लॉय करें जो स्कोप वाली मेमोरी से ऐक्सेस की जा सकने वाली जगह पर हो:

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

ब्लॉग पोस्ट