กรณีการใช้งานพื้นที่เก็บข้อมูลของ Android และแนวทางปฏิบัติแนะนำ

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

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดเก็บและเข้าถึงไฟล์ใน Android ได้ที่คู่มือการฝึกอบรม เกี่ยวกับพื้นที่เก็บข้อมูล

จัดการไฟล์สื่อ

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

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

แสดงไฟล์รูปภาพหรือวิดีโอจากโฟลเดอร์หลายโฟลเดอร์

ค้นหาคอลเล็กชันสื่อ โดยใช้ query() API หากต้องการกรองหรือจัดเรียงไฟล์สื่อ ให้ปรับพารามิเตอร์ 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. สร้าง PendingIntent สำหรับคำขอเขียนหรือลบของแอปโดยใช้ MediaStore.createWriteRequest() หรือ MediaStore.createTrashRequest() แล้วแจ้งให้ผู้ใช้ขอสิทธิ์แก้ไขชุดไฟล์โดยเรียกใช้ Intent นั้น
  2. ประเมินการตอบสนองของผู้ใช้

    • หากได้รับสิทธิ์ ให้ดำเนินการแก้ไขหรือลบต่อไป
    • หากไม่ได้รับสิทธิ์ ให้บอกผู้ใช้ว่าทำไมฟีเจอร์ในแอปจึงต้องใช้สิทธิ์

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการกลุ่มไฟล์สื่อ โดยใช้วิธีการเหล่านี้ที่พร้อมใช้งานใน Android 11 ขึ้นไป

ทำงานใน Android 10

หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ให้เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต และใช้แนวทางสำหรับ Android 9 และต่ำกว่าต่อไปเพื่อดำเนินการนี้

ทำงานใน Android 9 หรือต่ำกว่า

ใช้แนวทางต่อไปนี้

  1. ขอสิทธิ์ WRITE_EXTERNAL_STORAGE โดยทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในหัวข้อขอสิทธิ์ของแอป
  2. ใช้ MediaStore API เพื่อแก้ไข หรือลบไฟล์สื่อ

นำเข้ารูปภาพเดียวที่มีอยู่แล้ว

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

แสดงอินเทอร์เฟซผู้ใช้ของคุณเอง

ใช้แนวทางต่อไปนี้

  1. ขอสิทธิ์ READ_EXTERNAL_STORAGE โดยทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในหัวข้อขอสิทธิ์ของแอป
  2. ใช้ query() API เพื่อ ค้นหาคอลเล็กชันสื่อ
  3. แสดงผลลัพธ์ใน UI ที่กำหนดเองของแอป

ใช้เครื่องมือเลือกของระบบ

ใช้ ACTION_GET_CONTENT Intent ซึ่งจะขอให้ผู้ใช้เลือกรูปภาพที่จะนำเข้า

หากต้องการกรองประเภทรูปภาพที่เครื่องมือเลือกของระบบแสดงให้ผู้ใช้เลือก คุณสามารถใช้ setType() หรือ EXTRA_MIME_TYPES

บันทึกรูปภาพเดียว

เมื่อต้องการบันทึกรูปภาพเดียวเพื่อใช้ในแอป (เช่น เพื่อใช้ เป็นรูปโปรไฟล์ของผู้ใช้) ให้ใช้ ACTION_IMAGE_CAPTURE Intent เพื่อขอให้ผู้ใช้ถ่ายรูปโดยใช้กล้องของอุปกรณ์ ระบบจะจัดเก็บรูปภาพที่บันทึกไว้ในตาราง MediaStore.Images

แชร์ไฟล์สื่อกับแอปอื่น

ใช้วิธี insert() เพื่อเพิ่มระเบียนลงใน MediaStore โดยตรง ดูข้อมูลเพิ่มเติมได้ที่ ส่วนเพิ่มรายการของ คู่มือพื้นที่เก็บข้อมูลสื่อ

แชร์ไฟล์สื่อกับแอปที่เฉพาะเจาะจง

ใช้คอมโพเนนต์ FileProvider ของ Android ตามที่อธิบายไว้ในคู่มือการตั้งค่าการแชร์ไฟล์

เข้าถึงไฟล์จากโค้ดหรือไลบรารีที่ใช้เส้นทางไฟล์โดยตรง

รวมตรรกะตามเวอร์ชัน Android ที่แอปทำงานอยู่

ทำงานใน Android 11

ใช้แนวทางต่อไปนี้

  1. ขอสิทธิ์ READ_EXTERNAL_STORAGE โดยทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในหัวข้อขอสิทธิ์ของแอป
  2. เข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรง

ดูข้อมูลเพิ่มเติมได้ที่ส่วนเกี่ยวกับวิธีเปิดไฟล์สื่อโดยใช้ เส้นทางไฟล์โดยตรง

ทำงานใน Android 10

หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ให้เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต และใช้แนวทางสำหรับ Android 9 และต่ำกว่าต่อไปเพื่อดำเนินการนี้

ทำงานใน Android 9 หรือต่ำกว่า

ใช้แนวทางต่อไปนี้

  1. ขอสิทธิ์ WRITE_EXTERNAL_STORAGE โดยทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในหัวข้อขอสิทธิ์ของแอป
  2. เข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรง

จัดการไฟล์ที่ไม่ใช่ไฟล์สื่อ

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

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

เปิดไฟล์เอกสาร

ใช้ ACTION_OPEN_DOCUMENT Intent เพื่อขอให้ผู้ใช้เลือกไฟล์ที่จะเปิดโดยใช้เครื่องมือเลือกของระบบ หากคุณ ต้องการกรองประเภทไฟล์ที่เครื่องมือเลือกของระบบจะแสดงให้ ผู้ใช้เลือก คุณสามารถใช้ 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);

เขียนไฟล์ในวอลุ่มที่จัดเก็บข้อมูลรอง

วอลุ่มที่จัดเก็บข้อมูลรองรวมถึงการ์ด SD คุณสามารถเข้าถึงข้อมูลเกี่ยวกับวอลุ่มที่จัดเก็บข้อมูลที่ระบุได้โดยใช้คลาส StorageVolume

รวมตรรกะตามเวอร์ชัน Android ที่แอปทำงานอยู่

ทำงานใน Android 11

ใช้แนวทางต่อไปนี้

  1. ใช้โมเดลพื้นที่เก็บข้อมูลที่กำหนดขอบเขต
  2. กำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) หรือต่ำกว่า
  3. ประกาศสิทธิ์ WRITE_EXTERNAL_STORAGE
  4. ดำเนินการเข้าถึงประเภทใดประเภทหนึ่งต่อไปนี้
    • การเข้าถึงไฟล์โดยใช้ MediaStore API
    • การเข้าถึงเส้นทางไฟล์โดยตรงโดยใช้ API เช่น File หรือ fopen()

ทำงานในเวอร์ชันเก่า

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

ย้ายข้อมูลไฟล์ที่มีอยู่จากตำแหน่งพื้นที่เก็บข้อมูลเดิม

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

รักษาสิทธิ์เข้าถึงตำแหน่งพื้นที่เก็บข้อมูลเดิมสำหรับการย้ายข้อมูล

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

หากแอปกำหนดเป้าหมายเป็น Android 11
  1. ตั้งค่าแฟล็ก preserveLegacyExternalStorage เป็น true เพื่อ รักษารูปแบบพื้นที่เก็บข้อมูล เดิมไว้เพื่อให้แอปย้ายข้อมูลของผู้ใช้ได้เมื่อผู้ใช้อัปเกรดเป็นแอปเวอร์ชันใหม่ที่กำหนดเป้าหมายเป็น Android 11

  2. เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตต่อไปเพื่อให้แอปเข้าถึงไฟล์ในตำแหน่งพื้นที่เก็บข้อมูลเดิมในอุปกรณ์ Android 10 ได้ต่อไป

หากแอปกำหนดเป้าหมายเป็น Android 10

เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต เพื่อให้ รักษาสิทธิ์เข้าถึงไฟล์ในตำแหน่งพื้นที่เก็บข้อมูลเดิมได้ง่ายขึ้น

ย้ายข้อมูลแอป

เมื่อแอปพร้อมที่จะย้ายข้อมูล ให้ใช้แนวทางต่อไปนี้

  1. กำหนดเป้าหมายเป็น Android 10 หรือต่ำกว่า
  2. เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต เพื่อให้ แอปเข้าถึงไฟล์ที่ต้องย้ายข้อมูลได้
  3. ปรับใช้โค้ดที่ใช้ File API เพื่อย้ายไฟล์จากตำแหน่งปัจจุบันภายใต้ /sdcard/ ไปยังตำแหน่งที่เข้าถึงได้ด้วยพื้นที่เก็บข้อมูลที่กำหนดขอบเขต

    1. ย้ายไฟล์แอปส่วนตัวไปยังไดเรกทอรีที่ getExternalFilesDir() เมธอดแสดงผล
    2. ย้ายไฟล์ที่ไม่ใช่ไฟล์สื่อที่แชร์ไปยังไดเรกทอรีย่อยที่กำหนดไว้สำหรับแอปของ ไดเรกทอรี Downloads/
  4. นำไดเรกทอรีพื้นที่เก็บข้อมูลเดิมของแอปออกจากไดเรกทอรี /sdcard/

หลังจากผู้ใช้ติดตั้งแอปเวอร์ชันใหม่แล้ว ผู้ใช้จะทำกระบวนการย้ายข้อมูลให้เสร็จสมบูรณ์ในอุปกรณ์ คุณสามารถตรวจสอบกระบวนการย้ายข้อมูลในฐานผู้ใช้ได้โดยสร้างเหตุการณ์การวิเคราะห์

หลังจากผู้ใช้ย้ายข้อมูลแล้ว ให้เผยแพร่การอัปเดตแอปอีกครั้งโดยกำหนดเป้าหมายเป็น Android 11

แชร์เนื้อหากับแอปอื่น

หากต้องการแชร์ไฟล์ของแอปกับแอปอื่นแอปเดียว ใช้ FileProvider สำหรับแอปทั้งหมดที่ต้องแชร์ ไฟล์ระหว่างกัน เราขอแนะนำให้ใช้ Content Provider สำหรับแต่ละแอป แล้ว ซิงค์ข้อมูลเมื่อมีการเพิ่มแอปลงในคอลเล็กชัน

แคชไฟล์ที่ไม่ใช่ไฟล์สื่อ

แนวทางที่คุณควรใช้จะขึ้นอยู่กับประเภทไฟล์ที่ต้องแคช

  • ไฟล์ขนาดเล็กหรือไฟล์ที่มีข้อมูลที่ละเอียดอ่อน: ใช้ Context#getCacheDir()
  • ไฟล์ขนาดใหญ่หรือไฟล์ที่ไม่มีข้อมูลที่ละเอียดอ่อน: ใช้ Context#getExternalCacheDir()

ส่งออกไฟล์ที่ไม่ใช่ไฟล์สื่อไปยังอุปกรณ์

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

จัดการไฟล์เฉพาะแอป

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

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

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

ไดเรกทอรีพื้นที่เก็บข้อมูลภายนอก

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

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

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

เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตชั่วคราว

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

เลือกไม่ใช้ในการทดสอบ

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

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

-e no-isolated-storage 1

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

เลือกไม่ใช้ในแอปเวอร์ชันที่ใช้งานจริง

หากแอปกำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) หรือต่ำกว่า คุณสามารถเลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตชั่วคราวในแอปเวอร์ชันที่ใช้งานจริงได้ แต่หากกำหนดเป้าหมายเป็น Android 10 คุณต้องตั้งค่า requestLegacyExternalStorage เป็น true ในไฟล์ Manifest ของแอป

<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 ได้จากแหล่งข้อมูลต่อไปนี้

บล็อกโพสต์