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

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

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

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

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

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

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

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

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

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

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

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

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

फ़ाइलों को ऐक्सेस करने और उन्हें सेव करने के लिए, File API का इस्तेमाल किया जा सकता है.

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

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

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();
}

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

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

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 API का इस्तेमाल करके, इस डायरेक्ट्री में मौजूद किसी फ़ाइल को ऐक्सेस करता है:

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 इंटेंट ऐक्शन शामिल हो.

अन्य संसाधन

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

वीडियो