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

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

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

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

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

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

กรณีการใช้งาน สรุป
แสดงไฟล์รูปภาพหรือวิดีโอทั้งหมด ใช้แนวทางเดียวกันนี้สำหรับ 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. สร้าง Intent ที่รอดําเนินการสําหรับคําขอเขียนหรือลบของแอปโดยใช้ 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 ที่กําหนดเองของแอป

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

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

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

จับภาพรูปภาพเดียว

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

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

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

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

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

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

เช่น คุณอาจค้นหาไฟล์ PDF, ODT และ TXT ทั้งหมดได้โดยใช้โค้ดต่อไปนี้

KotlinJava
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
      )
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()

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

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

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

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

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

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

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

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

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

เลือกไม่ใช้พื้นที่เก็บข้อมูลแบบจำกัดเพื่อให้รักษาลักษณะการทํางานของแอปใน Android เวอร์ชันต่างๆ ได้ง่ายขึ้น

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

เมื่อแอปพร้อมย้ายข้อมูล ให้ใช้วิธีการต่อไปนี้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

-e no-isolated-storage 1

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

บล็อกโพสต์