ऐप्लिकेशन के लिए खास तौर पर बनी फ़ाइलें ऐक्सेस करना

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

  • डिवाइस के स्टोरेज की डायरेक्ट्री: इन डायरेक्ट्री में, सेव की गई फ़ाइलों को सेव करने के लिए एक खास जगह और कैश मेमोरी का डेटा सेव करने के लिए दूसरी जगह शामिल होती है. सिस्टम, अन्य ऐप्लिकेशन को इन जगहों को ऐक्सेस करने से रोकता है. साथ ही, Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन पर, इन जगहों को एन्क्रिप्ट (सुरक्षित) किया जाता है. इन विशेषताओं की वजह से, ये जगहें संवेदनशील डेटा को सेव करने के लिए अच्छी जगहें बन जाती हैं. इस डेटा को सिर्फ़ आपका ऐप्लिकेशन ऐक्सेस कर सकता है.

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

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

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

डिवाइस के स्टोरेज से ऐक्सेस करना

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

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

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

परसिस्टेंट फ़ाइलें ऐक्सेस करना

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

फ़ाइलें ऐक्सेस और सेव करना

फ़ाइलों को ऐक्सेस और स्टोर करने के लिए, File एपीआई का इस्तेमाल किया जा सकता है.

अपने ऐप्लिकेशन की परफ़ॉर्मेंस को बनाए रखने के लिए, एक ही फ़ाइल को बार-बार न खोलें और न ही बंद करें.

यहां दिए गए कोड स्निपेट से, File एपीआई को इस्तेमाल करने का तरीका पता चलता है:

Kotlin

val file = File(context.filesDir, filename)

Java

File file = new File(context.getFilesDir(), filename);

स्ट्रीम का इस्तेमाल करके फ़ाइल सेव करना

File एपीआई का इस्तेमाल करने के बजाय, openFileOutput() को कॉल किया जा सकता है. इससे आपको FileOutputStream मिलेगा, जो filesDir डायरेक्ट्री में मौजूद फ़ाइल में डेटा सेव करता है.

यहां दिए गए कोड स्निपेट से पता चलता है कि किसी फ़ाइल में टेक्स्ट कैसे लिखा जाता है:

Kotlin

val filename = "myfile"
val fileContents = "Hello world!"
context.openFileOutput(filename, Context.MODE_PRIVATE).use {
        it.write(fileContents.toByteArray())
}

Java

String filename = "myfile";
String fileContents = "Hello world!";
try (FileOutputStream fos = context.openFileOutput(filename, Context.MODE_PRIVATE)) {
    fos.write(fileContents.toByteArray());
}

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

स्ट्रीम का इस्तेमाल करके किसी फ़ाइल को ऐक्सेस करना

किसी फ़ाइल को स्ट्रीम के तौर पर पढ़ने के लिए, openFileInput() का इस्तेमाल करें:

Kotlin

context.openFileInput(filename).bufferedReader().useLines { lines ->
    lines.fold("") { some, text ->
        "$some\n$text"
    }
}

Java

FileInputStream fis = context.openFileInput(filename);
InputStreamReader inputStreamReader =
        new InputStreamReader(fis, StandardCharsets.UTF_8);
StringBuilder stringBuilder = new StringBuilder();
try (BufferedReader reader = new BufferedReader(inputStreamReader)) {
    String line = reader.readLine();
    while (line != null) {
        stringBuilder.append(line).append('\n');
        line = reader.readLine();
    }
} catch (IOException e) {
    // Error occurred when opening raw file for reading.
} finally {
    String contents = stringBuilder.toString();
}

फ़ाइलों की सूची देखना

fileList() को कॉल करके, filesDir डायरेक्ट्री में मौजूद सभी फ़ाइलों के नामों की सूची पाई जा सकती है. इसके बारे में यहां दिए गए कोड स्निपेट में बताया गया है:

Kotlin

var files: Array<String> = context.fileList()

Java

Array<String> files = context.fileList();

नेस्टेड डायरेक्ट्री बनाना

Kotlin पर आधारित कोड में getDir() को कॉल करके, नेस्ट की गई डायरेक्ट्री भी बनाई जा सकती हैं या कोई इनर डायरेक्ट्री खोली जा सकती है. इसके अलावा, Java पर आधारित कोड में File कंस्ट्रक्टर में रूट डायरेक्ट्री और नई डायरेक्ट्री का नाम पास करके भी ऐसा किया जा सकता है:

Kotlin

context.getDir(dirName, Context.MODE_PRIVATE)

Java

File directory = context.getFilesDir();
File file = new File(directory, filename);

कैश मेमोरी में सेव की गई फ़ाइलें बनाना

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

कैश मेमोरी में सेव की गई फ़ाइल बनाने के लिए, File.createTempFile() को कॉल करें:

Kotlin

File.createTempFile(filename, null, context.cacheDir)

Java

File.createTempFile(filename, null, context.getCacheDir());

आपका ऐप्लिकेशन, कॉन्टेक्स्ट ऑब्जेक्ट की cacheDir प्रॉपर्टी और File एपीआई का इस्तेमाल करके, इस डायरेक्ट्री में मौजूद किसी फ़ाइल को ऐक्सेस करता है:

Kotlin

val cacheFile = File(context.cacheDir, filename)

Java

File cacheFile = new File(context.getCacheDir(), filename);

कैश मेमोरी में सेव की गई फ़ाइलें हटाना

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

डिवाइस के स्टोरेज में मौजूद कैश डायरेक्ट्री से किसी फ़ाइल को हटाने के लिए, इनमें से कोई एक तरीका अपनाएं:

  • फ़ाइल को दिखाने वाले File ऑब्जेक्ट पर delete() तरीका:

    Kotlin

    cacheFile.delete()

    Java

    cacheFile.delete();
  • ऐप्लिकेशन के कॉन्टेक्स्ट का deleteFile() तरीका, फ़ाइल का नाम पास करना:

    Kotlin

    context.deleteFile(cacheFileName)

    Java

    context.deleteFile(cacheFileName);

बाहरी स्टोरेज से ऐक्सेस करना

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

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

Android 9 (एपीआई लेवल 28) या इससे पहले के वर्शन वाले डिवाइसों पर, आपका ऐप्लिकेशन अन्य ऐप्लिकेशन की खास फ़ाइलों को ऐक्सेस कर सकता है. इसके लिए, आपके ऐप्लिकेशन के पास स्टोरेज से जुड़ी ज़रूरी अनुमतियां होनी चाहिए. उपयोगकर्ताओं को उनकी फ़ाइलों पर ज़्यादा कंट्रोल देने और फ़ाइलों को व्यवस्थित रखने के लिए, Android 10 (एपीआई लेवल 29) और इसके बाद के वर्शन को टारगेट करने वाले ऐप्लिकेशन को, डिफ़ॉल्ट रूप से बाहरी स्टोरेज या डिवाइस के स्कोप किए गए स्टोरेज का स्कोप किया गया ऐक्सेस दिया जाता है. डिवाइस का स्कोप किया गया स्टोरेज चालू होने पर, ऐप्लिकेशन दूसरे ऐप्लिकेशन की डायरेक्ट्री को ऐक्सेस नहीं कर सकते.

पुष्टि करना कि स्टोरेज उपलब्ध है

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

Environment.getExternalStorageState() को कॉल करके, वॉल्यूम की स्थिति के बारे में क्वेरी की जा सकती है. अगर वापस किया गया स्टेटस MEDIA_MOUNTED है, तो बाहरी स्टोरेज में मौजूद, ऐप्लिकेशन के लिए खास तौर पर बनाई गई फ़ाइलों को पढ़ा और उनमें बदलाव किया जा सकता है. अगर यह MEDIA_MOUNTED_READ_ONLY है, तो आपके पास इन फ़ाइलों को सिर्फ़ पढ़ने का ऐक्सेस होगा.

उदाहरण के लिए, स्टोरेज की उपलब्धता का पता लगाने के लिए, ये तरीके काम के हैं:

Kotlin

// Checks if a volume containing external storage is available
// for read and write.
fun isExternalStorageWritable(): Boolean {
    return Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED
}

// Checks if a volume containing external storage is available to at least read.
fun isExternalStorageReadable(): Boolean {
     return Environment.getExternalStorageState() in
        setOf(Environment.MEDIA_MOUNTED, Environment.MEDIA_MOUNTED_READ_ONLY)
}

Java

// Checks if a volume containing external storage is available
// for read and write.
private boolean isExternalStorageWritable() {
    return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}

// Checks if a volume containing external storage is available to at least read.
private boolean isExternalStorageReadable() {
     return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ||
            Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY);
}

जिन डिवाइसों में बाहरी स्टोरेज को हटाया नहीं जा सकता उनमें वर्चुअल वॉल्यूम चालू करने के लिए, इस कमांड का इस्तेमाल करें. इससे, बाहरी स्टोरेज की उपलब्धता के लॉजिक की जांच की जा सकेगी:

adb shell sm set-virtual-disk true

डेटा स्टोर करने के लिए कोई जगह चुनना

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

अलग-अलग जगहों पर मौजूद स्टोर को ऐक्सेस करने के लिए, ContextCompat.getExternalFilesDirs() पर कॉल करें. कोड स्निपेट में दिखाए गए तरीके के मुताबिक, दिखाए गए कलेक्शन में मौजूद पहले एलिमेंट को मुख्य बाहरी स्टोरेज वॉल्यूम माना जाता है. इस वॉल्यूम का इस्तेमाल तब तक करें, जब तक यह भर न जाए या उपलब्ध न हो.

Kotlin

val externalStorageVolumes: Array<out File> =
        ContextCompat.getExternalFilesDirs(applicationContext, null)
val primaryExternalStorage = externalStorageVolumes[0]

Java

File[] externalStorageVolumes =
        ContextCompat.getExternalFilesDirs(getApplicationContext(), null);
File primaryExternalStorage = externalStorageVolumes[0];

परसिस्टेंट फ़ाइलें ऐक्सेस करना

बाहरी स्टोरेज से ऐप्लिकेशन के लिए खास तौर पर बनाई गई फ़ाइलों को ऐक्सेस करने के लिए, getExternalFilesDir() को कॉल करें.

अपने ऐप्लिकेशन की परफ़ॉर्मेंस को बनाए रखने के लिए, एक ही फ़ाइल को बार-बार न खोलें और न ही बंद करें.

यहां दिए गए कोड स्निपेट से पता चलता है कि getExternalFilesDir() को कैसे कॉल किया जाता है:

Kotlin

val appSpecificExternalDir = File(context.getExternalFilesDir(null), filename)

Java

File appSpecificExternalDir = new File(context.getExternalFilesDir(null), filename);

कैश मेमोरी में सेव की गई फ़ाइलें बनाना

बाहरी स्टोरेज में मौजूद कैश मेमोरी में, किसी ऐप्लिकेशन के लिए खास तौर पर बनाई गई फ़ाइल जोड़ने के लिए, externalCacheDir का रेफ़रंस पाएं:

Kotlin

val externalCacheFile = File(context.externalCacheDir, filename)

Java

File externalCacheFile = new File(context.getExternalCacheDir(), filename);

कैश मेमोरी में सेव की गई फ़ाइलें हटाना

बाहरी कैश मेमोरी डायरेक्ट्री से किसी फ़ाइल को हटाने के लिए, फ़ाइल को दिखाने वाले File ऑब्जेक्ट पर delete() तरीके का इस्तेमाल करें:

Kotlin

externalCacheFile.delete()

Java

externalCacheFile.delete();

मीडिया कॉन्टेंट

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

Kotlin

fun getAppSpecificAlbumStorageDir(context: Context, albumName: String): File? {
    // Get the pictures directory that's inside the app-specific directory on
    // external storage.
    val file = File(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName)
    if (!file?.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created")
    }
    return file
}

Java

@Nullable
File getAppSpecificAlbumStorageDir(Context context, String albumName) {
    // Get the pictures directory that's inside the app-specific directory on
    // external storage.
    File file = new File(context.getExternalFilesDir(
            Environment.DIRECTORY_PICTURES), albumName);
    if (file == null || !file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

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

खाली स्टोरेज के बारे में क्वेरी करना

कई उपयोगकर्ताओं के डिवाइसों में ज़्यादा स्टोरेज नहीं होता. इसलिए, आपके ऐप्लिकेशन को सोच-समझकर स्टोरेज का इस्तेमाल करना चाहिए.

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

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

नीचे दिया गया कोड स्निपेट, एक उदाहरण दिखाता है कि आपका ऐप्लिकेशन, डिवाइस पर खाली जगह के बारे में कैसे क्वेरी कर सकता है:

Kotlin

// App needs 10 MB within internal storage.
const val NUM_BYTES_NEEDED_FOR_MY_APP = 1024 * 1024 * 10L;

val storageManager = applicationContext.getSystemService<StorageManager>()!!
val appSpecificInternalDirUuid: UUID = storageManager.getUuidForPath(filesDir)
val availableBytes: Long =
        storageManager.getAllocatableBytes(appSpecificInternalDirUuid)
if (availableBytes >= NUM_BYTES_NEEDED_FOR_MY_APP) {
    storageManager.allocateBytes(
        appSpecificInternalDirUuid, NUM_BYTES_NEEDED_FOR_MY_APP)
} else {
    val storageIntent = Intent().apply {
        // To request that the user remove all app cache files instead, set
        // "action" to ACTION_CLEAR_APP_CACHE.
        action = ACTION_MANAGE_STORAGE
    }
}

Java

// App needs 10 MB within internal storage.
private static final long NUM_BYTES_NEEDED_FOR_MY_APP = 1024 * 1024 * 10L;

StorageManager storageManager =
        getApplicationContext().getSystemService(StorageManager.class);
UUID appSpecificInternalDirUuid = storageManager.getUuidForPath(getFilesDir());
long availableBytes =
        storageManager.getAllocatableBytes(appSpecificInternalDirUuid);
if (availableBytes >= NUM_BYTES_NEEDED_FOR_MY_APP) {
    storageManager.allocateBytes(
            appSpecificInternalDirUuid, NUM_BYTES_NEEDED_FOR_MY_APP);
} else {
    // To request that the user remove all app cache files instead, set
    // "action" to ACTION_CLEAR_APP_CACHE.
    Intent storageIntent = new Intent();
    storageIntent.setAction(ACTION_MANAGE_STORAGE);
}

स्टोरेज मैनेज करने से जुड़ी गतिविधि बनाना

आपका ऐप्लिकेशन, कस्टम गतिविधि का एलान कर सकता है और उसे बना सकता है. इसे लॉन्च करने पर, उपयोगकर्ता उस डेटा को मैनेज कर सकता है जिसे आपके ऐप्लिकेशन ने उपयोगकर्ता के डिवाइस पर सेव किया है. मेनिफ़ेस्ट फ़ाइल में android:manageSpaceActivity एट्रिब्यूट का इस्तेमाल करके, "स्टोरेज मैनेज करें" वाली इस कस्टम गतिविधि के बारे में एलान किया जाता है. फ़ाइल मैनेजर ऐप्लिकेशन, इस गतिविधि को शुरू कर सकते हैं. भले ही, आपका ऐप्लिकेशन इस गतिविधि को एक्सपोर्ट न करता हो. इसका मतलब है कि जब आपकी गतिविधि android:exported को false पर सेट करती है.

उपयोगकर्ता को डिवाइस से कुछ फ़ाइलें हटाने के लिए कहें

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

StorageStatsManager.getFreeBytes() / StorageStatsManager.getTotalBytes()

उपयोगकर्ता से सभी कैश फ़ाइलें हटाने के लिए कहें

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

अन्य संसाधन

डिवाइस के स्टोरेज में फ़ाइलें सेव करने के बारे में ज़्यादा जानने के लिए, यहां दिए गए लेख पढ़ें.

वीडियो