เข้าถึงไฟล์เฉพาะแอป

ในหลายกรณี แอปจะสร้างไฟล์ที่แอปอื่นๆ ไม่จำเป็นต้องเข้าถึง หรือ ไม่ควรเข้าถึง ระบบจะระบุตำแหน่งต่อไปนี้สำหรับจัดเก็บไฟล์ เฉพาะแอปดังกล่าว

  • ไดเรกทอรีที่เก็บข้อมูลภายใน: ไดเรกทอรีเหล่านี้มีทั้งตำแหน่งเฉพาะสำหรับจัดเก็บไฟล์ถาวร และตำแหน่งอื่นสำหรับจัดเก็บข้อมูลแคช ระบบจะป้องกันไม่ให้แอปอื่นๆ เข้าถึงตำแหน่งเหล่านี้ และ ใน Android 10 (API ระดับ 29) ขึ้นไป ระบบจะเข้ารหัสตำแหน่งเหล่านี้ ลักษณะเหล่านี้ทำให้ตำแหน่งเหล่านี้เป็นที่เก็บข้อมูลที่ละเอียดอ่อนที่ดี ซึ่งมีเพียงแอปของคุณเท่านั้นที่เข้าถึงได้

  • ไดเรกทอรีพื้นที่เก็บข้อมูลภายนอก: ไดเรกทอรีเหล่านี้มีทั้งตำแหน่งเฉพาะ สำหรับจัดเก็บไฟล์ถาวร และอีกตำแหน่งสำหรับจัดเก็บ ข้อมูลแคช แม้ว่าแอปอื่นจะเข้าถึงไดเรกทอรีเหล่านี้ได้ หากแอปนั้นมีสิทธิ์ที่เหมาะสม แต่ไฟล์ที่จัดเก็บไว้ในไดเรกทอรีเหล่านี้ มีไว้สำหรับแอปของคุณเท่านั้น หากคุณต้องการสร้างไฟล์ ที่แอปอื่นควรเข้าถึงได้ แอปของคุณควรจัดเก็บไฟล์เหล่านี้ไว้ในส่วนที่เก็บข้อมูลที่แชร์ของที่เก็บข้อมูลภายนอก แทน

เมื่อผู้ใช้ถอนการติดตั้งแอปของคุณ ระบบจะนำไฟล์ที่บันทึกไว้ในที่เก็บข้อมูลเฉพาะของแอปออก ด้วยลักษณะการทำงานนี้ คุณจึงไม่ควรใช้พื้นที่เก็บข้อมูลนี้เพื่อบันทึก สิ่งใดก็ตามที่ผู้ใช้คาดหวังว่าจะยังคงอยู่โดยไม่ขึ้นอยู่กับแอปของคุณ ตัวอย่างเช่น หากแอปอนุญาตให้ผู้ใช้ถ่ายรูป ผู้ใช้จะคาดหวังว่า ตนจะเข้าถึงรูปภาพเหล่านั้นได้แม้หลังจากถอนการติดตั้งแอปของคุณแล้ว ดังนั้นคุณควร ใช้พื้นที่เก็บข้อมูลที่แชร์แทนเพื่อบันทึกไฟล์ประเภทดังกล่าวไปยังคอลเล็กชันสื่อที่เหมาะสม

ส่วนต่อไปนี้จะอธิบายวิธีจัดเก็บและเข้าถึงไฟล์ภายใน ไดเรกทอรีเฉพาะแอป

เข้าถึงจากที่เก็บข้อมูลภายใน

สำหรับแต่ละแอป ระบบจะจัดเตรียมไดเรกทอรีภายในที่เก็บข้อมูลภายในซึ่งแอปสามารถจัดระเบียบไฟล์ของตนเองได้ ไดเรกทอรีหนึ่งออกแบบมาสำหรับไฟล์ถาวรของแอป และอีกไดเรกทอรีหนึ่งมีไฟล์ที่แคชของแอป แอปของคุณไม่จำเป็นต้องมีสิทธิ์ของระบบ เพื่ออ่านและเขียนไฟล์ในไดเรกทอรีเหล่านี้

แอปอื่นๆ จะเข้าถึงไฟล์ที่จัดเก็บไว้ในที่จัดเก็บข้อมูลภายในไม่ได้ ซึ่งทำให้ ที่เก็บข้อมูลภายในเป็นที่เก็บข้อมูลแอปที่แอปอื่นๆ ไม่ควรเข้าถึง

อย่างไรก็ตาม โปรดทราบว่าไดเรกทอรีเหล่านี้มักจะมีขนาดเล็ก ก่อนที่จะเขียนไฟล์เฉพาะแอปไปยังพื้นที่เก็บข้อมูลภายใน แอปควรค้นหาพื้นที่ว่างในอุปกรณ์

เข้าถึงไฟล์ถาวร

ไฟล์ปกติที่คงอยู่ของแอปจะอยู่ในไดเรกทอรีที่คุณเข้าถึงได้โดยใช้พร็อพเพอร์ตี้ filesDir ของออบเจ็กต์บริบท เฟรมเวิร์กมีหลายวิธีที่จะช่วยให้คุณ เข้าถึงและจัดเก็บไฟล์ในไดเรกทอรีนี้ได้

เข้าถึงและจัดเก็บไฟล์

คุณใช้ File API เพื่อเข้าถึงและจัดเก็บไฟล์ได้

อย่าเปิดและปิดไฟล์เดียวกันหลายครั้งเพื่อช่วยรักษาประสิทธิภาพของแอป

ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้ File API

Kotlin

val file = File(context.filesDir, filename)

Java

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

จัดเก็บไฟล์โดยใช้สตรีม

นอกจากการใช้ File API แล้ว คุณยังเรียกใช้ 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());
}

หากต้องการอนุญาตให้แอปอื่นๆ เข้าถึงไฟล์ที่จัดเก็บไว้ในไดเรกทอรีนี้ภายในที่จัดเก็บข้อมูลภายใน ให้ใช้ FileProvider ที่มีแอตทริบิวต์ FLAG_GRANT_READ_URI_PERMISSION

เข้าถึงไฟล์โดยใช้สตรีม

หากต้องการอ่านไฟล์เป็นสตรีม ให้ใช้ 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();

สร้างไดเรกทอรีแบบซ้อน

นอกจากนี้ คุณยังสร้างไดเรกทอรีย่อยหรือเปิดไดเรกทอรีด้านในได้โดยเรียกใช้ getDir() ในโค้ดที่ใช้ Kotlin หรือส่งไดเรกทอรีรากและชื่อไดเรกทอรีใหม่ไปยังตัวสร้าง File ในโค้ดที่ใช้ Java

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 จะลบไฟล์แคชด้วยตัวเอง แต่คุณก็ไม่ควรพึ่งพาระบบในการล้างไฟล์เหล่านี้ให้ คุณควรเก็บไฟล์แคชของแอปไว้ในที่เก็บข้อมูลภายในเสมอ

หากต้องการนำไฟล์ออกจากไดเรกทอรีแคชภายในที่เก็บข้อมูลภายใน ให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้

  • เมธอด delete() ในออบเจ็กต์ File ที่แสดงถึงไฟล์

    Kotlin

    cacheFile.delete()

    Java

    cacheFile.delete();
  • เมธอดของบริบทของแอป deleteFile() โดยส่งชื่อไฟล์

    Kotlin

    context.deleteFile(cacheFileName)

    Java

    context.deleteFile(cacheFileName);

การเข้าถึงจากที่จัดเก็บข้อมูลภายนอก

หากที่จัดเก็บข้อมูลภายในมีพื้นที่ไม่เพียงพอที่จะจัดเก็บไฟล์เฉพาะของแอป ให้ลองใช้ที่จัดเก็บข้อมูลภายนอกแทน ระบบจะจัดไดเรกทอรีภายใน พื้นที่เก็บข้อมูลภายนอกซึ่งแอปสามารถจัดระเบียบไฟล์ที่มีประโยชน์ต่อผู้ใช้ ได้ภายในแอปของคุณเท่านั้น ไดเรกทอรีหนึ่งออกแบบมาสำหรับไฟล์ถาวรของแอป และอีกไดเรกทอรีหนึ่งมีไฟล์ที่แคชของแอป

ใน Android 4.4 (API ระดับ 19) ขึ้นไป แอปไม่จำเป็นต้องขอสิทธิ์ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูลเพื่อเข้าถึงไดเรกทอรีเฉพาะของแอปภายในพื้นที่เก็บข้อมูลภายนอก ระบบจะนำไฟล์ที่จัดเก็บไว้ในไดเรกทอรีเหล่านี้ออกเมื่อคุณ ถอนการติดตั้งแอป

ในอุปกรณ์ที่ใช้ Android 9 (API ระดับ 28) หรือต่ำกว่า แอปของคุณจะเข้าถึง ไฟล์เฉพาะของแอปที่เป็นของแอปอื่นๆ ได้ หากแอปของคุณมี สิทธิ์เข้าถึงพื้นที่เก็บข้อมูลที่เหมาะสม เพื่อให้ผู้ใช้ควบคุมไฟล์ของตนได้มากขึ้นและ เพื่อจำกัดไม่ให้ไฟล์รกเกินไป ระบบจะให้สิทธิ์เข้าถึงที่จัดเก็บข้อมูลภายนอกแบบกำหนดขอบเขตหรือพื้นที่เก็บข้อมูลที่กำหนดขอบเขตแก่แอปที่กำหนดเป้าหมายเป็น Android 10 (API ระดับ 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

เลือกตำแหน่งพื้นที่เก็บข้อมูลจริง

บางครั้งอุปกรณ์ที่จัดสรรพาร์ติชันของหน่วยความจำภายในเป็น ที่เก็บข้อมูลภายนอกก็มีช่องเสียบการ์ด SD ด้วย ซึ่งหมายความว่าอุปกรณ์มี วอลุ่มจริงหลายรายการที่อาจมีพื้นที่เก็บข้อมูลภายนอก ดังนั้นคุณต้อง เลือกวอลุ่มที่จะใช้สำหรับพื้นที่เก็บข้อมูลเฉพาะแอป

หากต้องการเข้าถึงสถานที่ต่างๆ ให้โทรหา 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);

นำไฟล์แคชออก

หากต้องการนำไฟล์ออกจากไดเรกทอรีแคชภายนอก ให้ใช้เมธอด delete() ในออบเจ็กต์ File ที่ แสดงถึงไฟล์

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

คุณควรใช้ชื่อไดเรกทอรีที่ค่าคงที่ของ API ระบุ เช่น DIRECTORY_PICTURES ชื่อไดเรกทอรีเหล่านี้ช่วยให้ระบบจัดการไฟล์ได้อย่างถูกต้อง หากชื่อไดเรกทอรีย่อยที่กำหนดไว้ล่วงหน้าไม่เหมาะกับไฟล์ คุณสามารถส่ง null ไปยัง getExternalFilesDir() แทนได้ ซึ่งจะแสดงผลไดเรกทอรีเฉพาะแอปในรูท ภายในที่จัดเก็บข้อมูลภายนอก

ค้นหาพื้นที่ว่าง

ผู้ใช้จำนวนมากมีพื้นที่เก็บข้อมูลในอุปกรณ์ไม่มากนัก ดังนั้นแอปของคุณ จึงควรใช้พื้นที่อย่างรอบคอบ

หากทราบล่วงหน้าว่าคุณจะจัดเก็บข้อมูลมากน้อยเพียงใด คุณจะดูได้ว่าอุปกรณ์มีพื้นที่เก็บข้อมูลให้แอปของคุณเท่าใดโดยการเรียกใช้ 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 ในไฟล์ Manifest แอปจัดการไฟล์สามารถเรียกใช้กิจกรรมนี้ ได้แม้ว่าแอปของคุณจะไม่ได้ส่งออกกิจกรรมก็ตาม นั่นคือเมื่อกิจกรรมของคุณตั้งค่า android:exported เป็น false

ขอให้ผู้ใช้นำไฟล์บางไฟล์ในอุปกรณ์ออก

หากต้องการขอให้ผู้ใช้เลือกไฟล์ในอุปกรณ์ที่จะนำออก ให้เรียกใช้ Intent ที่มีการดำเนินการ ACTION_MANAGE_STORAGE ความตั้งใจนี้จะแสดงข้อความแจ้งต่อผู้ใช้ หากต้องการ พรอมต์นี้จะแสดงจำนวนพื้นที่ว่างที่มีอยู่ในอุปกรณ์ได้ หากต้องการแสดงข้อมูลที่ เป็นมิตรต่อผู้ใช้ ให้ใช้ผลลัพธ์จากการคำนวณต่อไปนี้

StorageStatsManager.getFreeBytes() / StorageStatsManager.getTotalBytes()

ขอให้ผู้ใช้นำไฟล์แคชทั้งหมดออก

หรือคุณจะขอให้ผู้ใช้ล้างไฟล์แคชจากแอปทั้งหมดในอุปกรณ์ก็ได้ โดยเรียกใช้ Intent ที่มีการดำเนินการของ Intent ACTION_CLEAR_APP_CACHE

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกไฟล์ลงในพื้นที่เก็บข้อมูลของอุปกรณ์ได้จากแหล่งข้อมูลต่อไปนี้

วิดีโอ