Android 10 ได้เปิดตัวกระบวนทัศน์ใหม่เกี่ยวกับพื้นที่เก็บข้อมูลสำหรับแอปที่เรียกว่าพื้นที่เก็บข้อมูลที่กำหนดขอบเขต เพื่อให้ผู้ใช้ควบคุมไฟล์ของตนได้มากขึ้นและจำกัดความยุ่งเหยิงของไฟล์ พื้นที่เก็บข้อมูลที่กำหนดขอบเขตจะเปลี่ยนวิธีที่แอปจัดเก็บและเข้าถึงไฟล์ในที่จัดเก็บข้อมูลภายนอกของอุปกรณ์ โปรดทำตามแนวทางปฏิบัติแนะนำสำหรับ Use Case เกี่ยวกับพื้นที่เก็บข้อมูลที่พบบ่อยซึ่งระบุไว้ในคู่มือนี้เพื่อช่วยคุณย้ายข้อมูลแอปเพื่อรองรับพื้นที่เก็บข้อมูลที่กำหนดขอบเขต กรณีการใช้งานแบ่งออกเป็น 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
แสดงรูปภาพหรือวิดีโอจากโฟลเดอร์ที่ต้องการ
ใช้แนวทางนี้
- ทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในขอสิทธิ์ของแอปเพื่อขอสิทธิ์
READ_EXTERNAL_STORAGE - ดึงข้อมูลไฟล์สื่อตามค่าของ
MediaColumns.DATAซึ่งมีเส้นทางระบบไฟล์สัมบูรณ์ไปยังรายการสื่อในดิสก์
หมายเหตุ: เมื่อเข้าถึงไฟล์สื่อที่มีอยู่ คุณสามารถใช้ค่าของคอลัมน์ DATA ในตรรกะได้ เนื่องจากค่านี้มีเส้นทางไฟล์ที่ถูกต้อง
อย่างไรก็ตาม อย่าคิดว่าไฟล์จะพร้อมใช้งานเสมอไป เตรียมพร้อมรับมือกับข้อผิดพลาด I/O ที่อิงตามไฟล์ที่อาจเกิดขึ้น
ในทางกลับกัน หากต้องการสร้างหรืออัปเดตไฟล์สื่อ อย่าใช้คอลัมน์ DATA แต่ให้ใช้คอลัมน์ DISPLAY_NAME และ RELATIVE_PATH แทน
เข้าถึงข้อมูลตำแหน่งจากรูปภาพ
หากแอปใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต ให้ทำตามขั้นตอนในส่วนข้อมูลตำแหน่งในรูปภาพของคู่มือพื้นที่เก็บข้อมูลสื่อ
กำหนดตำแหน่งที่เก็บข้อมูลสำหรับการดาวน์โหลดใหม่
หากแอปใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต โปรดคำนึงถึงตำแหน่งที่คุณเลือกจัดเก็บไฟล์สื่อที่ดาวน์โหลด
หากแอปอื่นๆ ต้องการเข้าถึงไฟล์ ให้พิจารณาใช้คอลเล็กชันสื่อที่กำหนดไว้อย่างชัดเจนสำหรับการดาวน์โหลดหรือคอลเล็กชันเอกสาร
ใน Android 11 ขึ้นไป แอปอื่นๆ จะเข้าถึงไฟล์ภายในไดเรกทอรีภายนอกที่เจาะจงแอปไม่ได้ แม้ว่าคุณจะใช้ DownloadManager เพื่อดึงข้อมูลไฟล์เหล่านี้ก็ตาม
ส่งออกไฟล์สื่อของผู้ใช้ไปยังอุปกรณ์
กำหนดตำแหน่งเริ่มต้นที่เหมาะสมเพื่อจัดเก็บไฟล์สื่อของผู้ใช้ ดังนี้
- อนุญาตให้ผู้ใช้เลือกว่าจะให้แอปอื่นๆ อ่านไฟล์สื่อของตนได้หรือไม่ โดยใช้พื้นที่เก็บข้อมูลเฉพาะแอปหรือพื้นที่เก็บข้อมูลที่ใช้ร่วมกัน
- อนุญาตให้ผู้ใช้ส่งออกไฟล์จากไดเรกทอรีเฉพาะแอปไปยังตำแหน่งที่เข้าถึงได้ทั่วไปมากขึ้น ใช้คอลเล็กชันรูปภาพ วิดีโอ และเสียงของ MediaStore เพื่อส่งออกไฟล์สื่อไปยังแกลเลอรีของอุปกรณ์
แก้ไขหรือลบไฟล์สื่อหลายไฟล์ในการดำเนินการเดียว
รวมตรรกะตามเวอร์ชัน Android ที่แอปของคุณทำงานอยู่
ทำงานบน Android 11
ใช้แนวทางนี้
- สร้าง Intent รอดำเนินการสำหรับคำขอเขียนหรือลบของแอปโดยใช้
MediaStore.createWriteRequest()หรือMediaStore.createTrashRequest()แล้วแจ้งให้ผู้ใช้ให้สิทธิ์แก้ไขชุดไฟล์โดยเรียกใช้ Intent นั้น ประเมินคำตอบของผู้ใช้โดยทำดังนี้
- หากได้รับสิทธิ์แล้ว ให้ดำเนินการแก้ไขหรือลบต่อไป
- หากไม่ได้รับสิทธิ์ ให้อธิบายแก่ผู้ใช้ว่าเหตุใดฟีเจอร์ในแอปจึงต้องใช้สิทธิ์ดังกล่าว
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการกลุ่มไฟล์สื่อโดยใช้วิธีการเหล่านี้ซึ่งพร้อมใช้งานใน Android 11 ขึ้นไป
ทำงานใน Android 10
หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ให้เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตและใช้วิธีการสำหรับ Android 9 และต่ำกว่าต่อไปเพื่อดำเนินการนี้
ใช้ Android 9 หรือต่ำกว่า
ใช้แนวทางนี้
- ทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในขอสิทธิ์ของแอปเพื่อขอสิทธิ์
WRITE_EXTERNAL_STORAGE - ใช้
MediaStoreAPI เพื่อแก้ไขหรือลบไฟล์สื่อ
นำเข้ารูปภาพเดียวที่มีอยู่แล้ว
เมื่อต้องการนำเข้ารูปภาพเดียวที่มีอยู่แล้ว (เช่น เพื่อใช้เป็นรูปภาพสำหรับโปรไฟล์ของผู้ใช้) แอปของคุณจะใช้ UI ของตนเองสำหรับการดำเนินการ หรือจะใช้เครื่องมือเลือกของระบบก็ได้
แสดงอินเทอร์เฟซผู้ใช้ของคุณเอง
ใช้แนวทางนี้
- ทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในขอสิทธิ์ของแอปเพื่อขอสิทธิ์
READ_EXTERNAL_STORAGE - ใช้
query()API เพื่อค้นหาคอลเล็กชันสื่อ - แสดงผลลัพธ์ใน UI ที่กำหนดเองของแอป
ใช้เครื่องมือเลือกของระบบ
ใช้ Intent ACTION_GET_CONTENT ซึ่งจะขอให้ผู้ใช้เลือกรูปภาพที่จะนำเข้า
หากต้องการกรองประเภทรูปภาพที่เครื่องมือเลือกของระบบแสดงให้ผู้ใช้เลือก คุณสามารถใช้ setType() หรือ EXTRA_MIME_TYPES
จับภาพเดียว
เมื่อต้องการจับภาพเดียวเพื่อใช้ในแอป (เช่น ใช้เป็นรูปโปรไฟล์ของผู้ใช้) ให้ใช้ Intent ACTION_IMAGE_CAPTURE เพื่อขอให้ผู้ใช้ถ่ายภาพโดยใช้กล้องของอุปกรณ์ ระบบจะจัดเก็บรูปภาพที่ถ่ายไว้ในตาราง MediaStore.Images
แชร์ไฟล์สื่อกับแอปอื่นๆ
ใช้เมธอด
insert()
เพื่อเพิ่มระเบียนลงใน MediaStore โดยตรง ดูข้อมูลเพิ่มเติมได้ที่ส่วนเพิ่มรายการในคู่มือพื้นที่เก็บข้อมูลสื่อ
แชร์ไฟล์สื่อกับแอปที่เฉพาะเจาะจง
ใช้คอมโพเนนต์ FileProvider ของ Android ตามที่อธิบายไว้ในคู่มือการตั้งค่าการแชร์ไฟล์
เข้าถึงไฟล์จากโค้ดหรือไลบรารีที่ใช้เส้นทางไฟล์โดยตรง
รวมตรรกะตามเวอร์ชัน Android ที่แอปของคุณทำงานอยู่
ทำงานบน Android 11
ใช้แนวทางนี้
- ทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในขอสิทธิ์ของแอปเพื่อขอสิทธิ์
READ_EXTERNAL_STORAGE - เข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรง
ดูข้อมูลเพิ่มเติมได้ที่ส่วนเกี่ยวกับวิธีเปิดไฟล์สื่อโดยใช้เส้นทางไฟล์โดยตรง
ทำงานใน Android 10
หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ให้เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต และใช้วิธีการสำหรับ Android 9 และต่ำกว่าต่อไปเพื่อดำเนินการนี้
ใช้ Android 9 หรือต่ำกว่า
ใช้แนวทางนี้
- ทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในขอสิทธิ์ของแอปเพื่อขอสิทธิ์
WRITE_EXTERNAL_STORAGE - เข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรง
จัดการไฟล์ที่ไม่ใช่สื่อ
ส่วนนี้จะอธิบายกรณีการใช้งานทั่วไปบางกรณีสำหรับการจัดการไฟล์ที่ไม่ใช่สื่อ และอธิบายแนวทางระดับสูงที่แอปของคุณใช้ได้ ตารางต่อไปนี้จะสรุป Use Case แต่ละรายการและลิงก์ไปยังแต่ละส่วนที่มีรายละเอียดเพิ่มเติม
| กรณีการใช้งาน | สรุป |
|---|---|
| เปิดไฟล์เอกสาร | ใช้วิธีการเดียวกันนี้กับ Android ทุกเวอร์ชัน |
| เขียนลงในไฟล์ในวอลุ่มพื้นที่เก็บข้อมูลสำรอง | ใช้แนวทางเดียวสำหรับ Android 11 ใช้วิธีอื่นสำหรับ Android เวอร์ชันก่อนหน้า |
| ย้ายข้อมูลไฟล์ที่มีอยู่จากตำแหน่งพื้นที่เก็บข้อมูลเดิม | ย้ายข้อมูลไฟล์ไปยังพื้นที่เก็บข้อมูลที่กำหนดขอบเขตเมื่อเป็นไปได้ เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตสำหรับ Android 10 เมื่อจำเป็น |
| แชร์เนื้อหากับแอปอื่นๆ | ใช้วิธีการเดียวกันนี้กับ Android ทุกเวอร์ชัน |
| แคชไฟล์ที่ไม่ใช่สื่อ | ใช้วิธีการเดียวกันนี้กับ Android ทุกเวอร์ชัน |
| ส่งออกไฟล์ที่ไม่ใช่สื่อไปยังอุปกรณ์ | ใช้วิธีการเดียวหากแอปใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต ใช้วิธีอื่นหากแอปเลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต |
เปิดไฟล์เอกสาร
ใช้ Intent 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
ใช้แนวทางนี้
- ใช้โมเดลพื้นที่เก็บข้อมูลที่กำหนดขอบเขต
- กำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) หรือต่ำกว่า
- ประกาศสิทธิ์
WRITE_EXTERNAL_STORAGE - ดำเนินการเข้าถึงประเภทใดประเภทหนึ่งต่อไปนี้
- การเข้าถึงไฟล์โดยใช้
MediaStoreAPI - การเข้าถึงเส้นทางไฟล์โดยตรงโดยใช้ API เช่น
Fileหรือfopen()
- การเข้าถึงไฟล์โดยใช้
การทำงานในเวอร์ชันเก่า
ใช้เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล ซึ่งช่วยให้ผู้ใช้เลือกตำแหน่งในวอลุ่มพื้นที่เก็บข้อมูลรองที่แอปของคุณสามารถเขียนไฟล์ได้
ย้ายข้อมูลไฟล์ที่มีอยู่จากตำแหน่งพื้นที่เก็บข้อมูลเดิม
ระบบจะถือว่าไดเรกทอรีเป็นตำแหน่งพื้นที่เก็บข้อมูลเดิมหากไม่ใช่ไดเรกทอรีเฉพาะแอปหรือไดเรกทอรีที่แชร์แบบสาธารณะ หากแอปสร้างหรือใช้ไฟล์ในตำแหน่งพื้นที่เก็บข้อมูลเดิม เราขอแนะนำให้ย้ายข้อมูลไฟล์ของแอปไปยังตำแหน่งที่เข้าถึงได้ด้วยพื้นที่เก็บข้อมูลที่กำหนดขอบเขต และทำการเปลี่ยนแปลงแอปที่จำเป็นเพื่อให้ทำงานกับไฟล์ในพื้นที่เก็บข้อมูลที่กำหนดขอบเขตได้
คงสิทธิ์เข้าถึงตำแหน่งพื้นที่เก็บข้อมูลเดิมสำหรับการย้ายข้อมูล
แอปของคุณต้องรักษาสิทธิ์เข้าถึงตำแหน่งพื้นที่เก็บข้อมูลเดิมเพื่อย้ายข้อมูลไฟล์แอปไปยังตำแหน่งที่เข้าถึงได้ด้วยพื้นที่เก็บข้อมูลที่กำหนดขอบเขต แนวทางที่คุณควรใช้ขึ้นอยู่กับระดับ API เป้าหมายของแอป
หากแอปกำหนดเป้าหมายเป็น Android 11
ตั้งค่าแฟล็ก
preserveLegacyExternalStorageเป็นtrueเพื่อคงรูปแบบพื้นที่เก็บข้อมูลเดิมไว้ เพื่อให้แอปย้ายข้อมูลของผู้ใช้ได้เมื่อผู้ใช้อัปเกรดเป็นแอปเวอร์ชันใหม่ที่กำหนดเป้าหมายเป็น Android 11เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตต่อไปเพื่อให้แอปเข้าถึงไฟล์ในตำแหน่งพื้นที่เก็บข้อมูลเดิมบนอุปกรณ์ Android 10 ได้
หากแอปของคุณกำหนดเป้าหมายเป็น Android 10
เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตเพื่อให้รักษาลักษณะการทำงานของแอปใน Android เวอร์ชันต่างๆ ได้ง่ายขึ้น
ย้ายข้อมูลแอป
เมื่อแอปพร้อมที่จะย้ายข้อมูล ให้ใช้วิธีการต่อไปนี้
- กำหนดเป้าหมายเป็น Android 10 หรือต่ำกว่า
- เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตเพื่อให้แอปมีสิทธิ์เข้าถึงไฟล์ที่ต้องการย้ายข้อมูล
-
ติดตั้งใช้งานโค้ดที่ใช้
FileAPI เพื่อย้ายไฟล์จากตำแหน่งปัจจุบันใน/sdcard/ไปยังตำแหน่งที่เข้าถึงได้ด้วยพื้นที่เก็บข้อมูลที่กำหนดขอบเขต ดังนี้- ย้ายไฟล์แอปส่วนตัวไปยังไดเรกทอรีที่แสดงผลโดยเมธอด
getExternalFilesDir() - ย้ายไฟล์ที่ไม่ใช่สื่อที่แชร์ไปยังไดเรกทอรีย่อยเฉพาะแอปของไดเรกทอรี
Downloads/
- ย้ายไฟล์แอปส่วนตัวไปยังไดเรกทอรีที่แสดงผลโดยเมธอด
- นำไดเรกทอรีพื้นที่เก็บข้อมูลเดิมของแอปออกจากไดเรกทอรี
/sdcard/
หลังจากผู้ใช้ติดตั้งแอปเวอร์ชันใหม่แล้ว ผู้ใช้จะดำเนินการย้ายข้อมูลในอุปกรณ์ให้เสร็จสมบูรณ์ คุณสามารถตรวจสอบกระบวนการย้ายข้อมูลในฐานผู้ใช้ได้โดยการสร้างเหตุการณ์ Analytics
หลังจากผู้ใช้ย้ายข้อมูลแล้ว ให้เผยแพร่การอัปเดตแอปอีกครั้งโดยกำหนดเป้าหมายเป็น Android 11
แชร์เนื้อหากับแอปอื่นๆ
หากต้องการแชร์ไฟล์ของแอปกับแอปอื่นเพียงแอปเดียว ให้ใช้ FileProvider สำหรับแอปทั้งหมดที่จำเป็นต้องแชร์ไฟล์ระหว่างกัน เราขอแนะนำให้ใช้ Content Provider สำหรับแต่ละแอป แล้วซิงค์ข้อมูลเมื่อมีการเพิ่มแอปลงในคอลเล็กชัน
แคชไฟล์ที่ไม่ใช่สื่อ
แนวทางที่คุณควรใช้จะขึ้นอยู่กับประเภทไฟล์ที่ต้องการแคช
- ไฟล์ขนาดเล็กหรือไฟล์ที่มีข้อมูลที่ละเอียดอ่อน: ใช้
Context#getCacheDir() - ไฟล์ขนาดใหญ่หรือไฟล์ที่ไม่มีข้อมูลที่ละเอียดอ่อน: ใช้
Context#getExternalCacheDir()
ส่งออกไฟล์ที่ไม่ใช่สื่อไปยังอุปกรณ์
กำหนดตำแหน่งเริ่มต้นที่เหมาะสมเพื่อจัดเก็บไฟล์ที่ไม่ใช่สื่อ อนุญาตให้ผู้ใช้ส่งออกไฟล์จากไดเรกทอรีเฉพาะแอปไปยังตำแหน่งที่เข้าถึงได้ทั่วไปมากขึ้น ใช้การดาวน์โหลดหรือคอลเล็กชันเอกสารของ MediaStore เพื่อส่งออกไฟล์ที่ไม่ใช่สื่อไปยังอุปกรณ์
จัดการไฟล์เฉพาะแอป
ในกรณีที่แอปสร้างไฟล์ที่แอปอื่นๆ ไม่จำเป็นต้องเข้าถึงหรือไม่ควรเข้าถึง คุณสามารถจัดเก็บไฟล์เหล่านี้ไว้ในตำแหน่งที่จัดเก็บข้อมูลเฉพาะแอป
ไดเรกทอรีพื้นที่เก็บข้อมูลภายใน
ระบบจะป้องกันไม่ให้แอปอื่นๆ เข้าถึงตำแหน่งเหล่านี้ และใน Android 10 (ระดับ API 29) ขึ้นไป ตำแหน่งเหล่านี้จะได้รับการเข้ารหัส ตำแหน่งเหล่านี้เป็นที่ที่เหมาะสำหรับการจัดเก็บข้อมูลที่ละเอียดอ่อนซึ่งมีเพียงแอปของคุณเท่านั้นที่เข้าถึงได้
ไดเรกทอรีพื้นที่เก็บข้อมูลภายนอก
หากที่จัดเก็บข้อมูลภายในมีพื้นที่ไม่เพียงพอสำหรับจัดเก็บไฟล์เฉพาะแอป ให้พิจารณาใช้ที่จัดเก็บข้อมูลภายนอกแทน แม้ว่าแอปอื่นจะเข้าถึงไดเรกทอรีเหล่านี้ได้หากแอปนั้นมีสิทธิ์ที่เหมาะสม แต่ไฟล์ที่จัดเก็บไว้ในไดเรกทอรีเหล่านี้มีไว้สำหรับแอปของคุณเท่านั้น
ใน Android 4.4 (ระดับ API 19) ขึ้นไป แอปของคุณไม่จำเป็นต้องขอสิทธิ์ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูลเพื่อเข้าถึงไดเรกทอรีเฉพาะแอปภายในที่จัดเก็บข้อมูลภายนอก
เมื่อผู้ใช้ถอนการติดตั้งแอป ระบบจะนำไฟล์ที่บันทึกไว้ในพื้นที่เก็บข้อมูลเฉพาะแอปออก ดังนั้นคุณจึงไม่ควรใช้พื้นที่เก็บข้อมูลนี้เพื่อบันทึกข้อมูลที่ผู้ใช้คาดหวังว่าจะยังคงอยู่โดยไม่ขึ้นอยู่กับแอป
เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตชั่วคราว
ก่อนที่แอปจะเข้ากันได้กับพื้นที่เก็บข้อมูลที่กำหนดขอบเขตอย่างสมบูรณ์ คุณสามารถเลือกไม่ใช้ชั่วคราวได้ทั้งในการทดสอบและในแอปเวอร์ชันที่ใช้งานจริง
เลือกไม่ใช้ในการทดสอบ
ใน Android 10 (ระดับ API 29) ขึ้นไป การทดสอบของแอปจะทำงานในแซนด์บ็อกซ์พื้นที่เก็บข้อมูลโดยค่าเริ่มต้น แซนด์บ็อกซ์นี้จะป้องกันไม่ให้แอปเข้าถึงไฟล์นอกไดเรกทอรีเฉพาะแอปและไดเรกทอรีที่แชร์แบบสาธารณะ
หากการทดสอบสร้างไฟล์เอาต์พุตสำหรับโฮสต์ เช่น ภาพหน้าจอ ข้อมูลการแก้ไขข้อบกพร่อง ข้อมูลความครอบคลุม หรือเมตริกประสิทธิภาพ คุณสามารถเขียนไฟล์เหล่านี้ลงในไดเรกทอรีส่วนกลางได้ โดยเพิ่มแฟล็กต่อไปนี้ลงในชุดทดสอบที่เกี่ยวข้องซึ่งเรียกใช้ 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 ได้จากแหล่งข้อมูลต่อไปนี้