กรณีการใช้งานพื้นที่เก็บข้อมูลของ 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 ที่กำหนดเองของแอป

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

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

หากต้องการกรองประเภทของรูปภาพที่เครื่องมือเลือกของระบบนำเสนอต่อ ให้ผู้ใช้เลือก คุณก็สามารถใช้ 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 ทั้งหมดโดยใช้สิ่งต่อไปนี้ รหัส:

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

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

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

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

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

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

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

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

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

-e no-isolated-storage 1

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

บล็อกโพสต์