เพื่อให้ผู้ใช้ควบคุมไฟล์ได้มากขึ้นและจำกัดไม่ให้ไฟล์กระจัดกระจาย 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
แสดงรูปภาพหรือวิดีโอจากโฟลเดอร์ที่เฉพาะเจาะจง
ใช้แนวทางต่อไปนี้
- ขอสิทธิ์
READ_EXTERNAL_STORAGEโดยทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในหัวข้อขอสิทธิ์ของแอป - ดึงข้อมูลไฟล์สื่อตามค่าของ
MediaColumns.DATA, ซึ่งมีเส้นทางไฟล์ระบบสัมบูรณ์ไปยังรายการสื่อในดิสก์
หมายเหตุ: เมื่อเข้าถึงไฟล์สื่อที่มีอยู่ คุณสามารถใช้ค่า
ของคอลัมน์ DATA
ในตรรกะได้ เนื่องจากค่านี้มีเส้นทางไฟล์ที่ถูกต้อง
อย่างไรก็ตาม อย่าคิดว่าไฟล์จะพร้อมใช้งานเสมอ เตรียมพร้อมที่จะจัดการ ข้อผิดพลาด I/O ที่อิงตามไฟล์ซึ่งอาจเกิดขึ้น
ในทางกลับกัน หากต้องการสร้างหรืออัปเดตไฟล์สื่อ ให้ใช้คอลัมน์
DATA แทน แทนคอลัมน์ DISPLAY_NAME และ
RELATIVE_PATH
เข้าถึงข้อมูลตำแหน่งจากรูปภาพ
หากแอปใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต ให้ทำตามขั้นตอนในส่วนข้อมูลตำแหน่ง ในรูปภาพ ของคู่มือพื้นที่เก็บข้อมูลสื่อ
กำหนดตำแหน่งพื้นที่เก็บข้อมูลสำหรับการดาวน์โหลดใหม่
หากแอปใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต โปรดคำนึงถึงตำแหน่งที่คุณเลือกจัดเก็บไฟล์สื่อที่ดาวน์โหลด
หากแอปอื่นๆ ต้องเข้าถึงไฟล์ ให้พิจารณาใช้คอลเล็กชันสื่อ หรือคอลเล็กชันเอกสารที่กำหนดไว้อย่างดีสำหรับการดาวน์โหลด
ใน Android 11 ขึ้นไป แอปอื่นๆ จะเข้าถึงไฟล์ภายในไดเรกทอรีเฉพาะแอปภายนอก
ไม่ได้ แม้ว่าคุณจะใช้ DownloadManager เพื่อ
ดึงไฟล์เหล่านี้ก็ตาม
ส่งออกไฟล์สื่อของผู้ใช้ไปยังอุปกรณ์
กำหนดตำแหน่งเริ่มต้นที่เหมาะสมเพื่อจัดเก็บไฟล์สื่อของผู้ใช้ โดยทำดังนี้
- อนุญาตให้ผู้ใช้เลือกว่าจะให้แอปอื่นๆ อ่านไฟล์สื่อได้หรือไม่ โดยใช้ พื้นที่เก็บข้อมูลเฉพาะแอป หรือ พื้นที่เก็บข้อมูลที่แชร์
- อนุญาตให้ผู้ใช้ส่งออกไฟล์จาก ไดเรกทอรีเฉพาะแอปไปยังตำแหน่งที่เข้าถึงได้ทั่วไปมากขึ้น ใช้คอลเล็กชันรูปภาพ วิดีโอ และเสียงของ MediaStore เพื่อส่งออกไฟล์สื่อไปยัง แกลเลอรีของอุปกรณ์
แก้ไขหรือลบไฟล์สื่อหลายไฟล์ในการดำเนินการครั้งเดียว
รวมตรรกะตามเวอร์ชัน Android ที่แอปทำงานอยู่
ทำงานใน Android 11
ใช้แนวทางต่อไปนี้
- สร้าง PendingIntent สำหรับคำขอเขียนหรือลบของแอปโดยใช้
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 ที่กำหนดเองของแอป
ใช้เครื่องมือเลือกของระบบ
ใช้ ACTION_GET_CONTENT
Intent ซึ่งจะขอให้ผู้ใช้เลือกรูปภาพที่จะนำเข้า
หากต้องการกรองประเภทรูปภาพที่เครื่องมือเลือกของระบบแสดงให้ผู้ใช้เลือก คุณสามารถใช้
setType()
หรือ EXTRA_MIME_TYPES
บันทึกรูปภาพเดียว
เมื่อต้องการบันทึกรูปภาพเดียวเพื่อใช้ในแอป (เช่น เพื่อใช้
เป็นรูปโปรไฟล์ของผู้ใช้) ให้ใช้
ACTION_IMAGE_CAPTURE
Intent เพื่อขอให้ผู้ใช้ถ่ายรูปโดยใช้กล้องของอุปกรณ์ ระบบจะจัดเก็บรูปภาพที่บันทึกไว้ในตาราง
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โดยทำตามแนวทางปฏิบัติแนะนำที่ระบุไว้ในหัวข้อขอสิทธิ์ของแอป - เข้าถึงไฟล์โดยใช้เส้นทางไฟล์โดยตรง
จัดการไฟล์ที่ไม่ใช่ไฟล์สื่อ
ส่วนนี้จะอธิบายกรณีการใช้งานทั่วไปบางกรณีสำหรับการจัดการไฟล์ที่ไม่ใช่ไฟล์สื่อและอธิบายแนวทางระดับสูงที่แอปของคุณใช้ได้ ตารางต่อไปนี้สรุปกรณีการใช้งานแต่ละกรณีและลิงก์ไปยังส่วนต่างๆ ที่มีรายละเอียดเพิ่มเติม
| กรณีการใช้งาน | สรุป |
|---|---|
| เปิดไฟล์เอกสาร | ใช้แนวทางเดียวกันสำหรับ 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
ใช้แนวทางต่อไปนี้
- ใช้โมเดลพื้นที่เก็บข้อมูลที่กำหนดขอบเขต
- กำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) หรือต่ำกว่า
- ประกาศสิทธิ์
WRITE_EXTERNAL_STORAGE - ดำเนินการเข้าถึงประเภทใดประเภทหนึ่งต่อไปนี้
- การเข้าถึงไฟล์โดยใช้
MediaStoreAPI - การเข้าถึงเส้นทางไฟล์โดยตรงโดยใช้ API เช่น
Fileหรือfopen()
- การเข้าถึงไฟล์โดยใช้
ทำงานในเวอร์ชันเก่า
ใช้ Storage Access Framework ซึ่งช่วยให้ผู้ใช้ เลือกตำแหน่งในวอลุ่มที่จัดเก็บข้อมูลรองที่แอปของคุณสามารถเขียน ไฟล์ได้
ย้ายข้อมูลไฟล์ที่มีอยู่จากตำแหน่งพื้นที่เก็บข้อมูลเดิม
ระบบจะถือว่าไดเรกทอรีเป็น ตำแหน่งพื้นที่เก็บข้อมูลเดิม หากไม่ใช่ไดเรกทอรีเฉพาะแอปหรือไดเรกทอรีที่แชร์แบบสาธารณะ หากแอปของคุณสร้างหรือใช้ไฟล์ในตำแหน่งพื้นที่เก็บข้อมูลเดิม เราขอแนะนำให้คุณย้ายข้อมูลไฟล์ของแอปไปยังตำแหน่งที่เข้าถึงได้ด้วยพื้นที่เก็บข้อมูลที่กำหนดขอบเขต และทำการเปลี่ยนแปลงแอปที่จำเป็นเพื่อทำงานกับไฟล์ในพื้นที่เก็บข้อมูลที่กำหนดขอบเขต
รักษาสิทธิ์เข้าถึงตำแหน่งพื้นที่เก็บข้อมูลเดิมสำหรับการย้ายข้อมูล
แอปของคุณต้องรักษาสิทธิ์เข้าถึงตำแหน่งพื้นที่เก็บข้อมูลเดิมเพื่อย้ายข้อมูลไฟล์ของแอปไปยังตำแหน่งที่เข้าถึงได้ด้วยพื้นที่เก็บข้อมูลที่กำหนดขอบเขต แนวทางที่คุณควรใช้จะขึ้นอยู่กับระดับ API เป้าหมายของแอป
หากแอปกำหนดเป้าหมายเป็น Android 11
ตั้งค่าแฟล็ก
preserveLegacyExternalStorageเป็นtrueเพื่อ รักษารูปแบบพื้นที่เก็บข้อมูล เดิมไว้เพื่อให้แอปย้ายข้อมูลของผู้ใช้ได้เมื่อผู้ใช้อัปเกรดเป็นแอปเวอร์ชันใหม่ที่กำหนดเป้าหมายเป็น Android 11
หากแอปกำหนดเป้าหมายเป็น Android 10
เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต เพื่อให้ รักษาสิทธิ์เข้าถึงไฟล์ในตำแหน่งพื้นที่เก็บข้อมูลเดิมได้ง่ายขึ้น
ย้ายข้อมูลแอป
เมื่อแอปพร้อมที่จะย้ายข้อมูล ให้ใช้แนวทางต่อไปนี้
- กำหนดเป้าหมายเป็น Android 10 หรือต่ำกว่า
- เลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต เพื่อให้ แอปเข้าถึงไฟล์ที่ต้องย้ายข้อมูลได้
-
ปรับใช้โค้ดที่ใช้
FileAPI เพื่อย้ายไฟล์จากตำแหน่งปัจจุบันภายใต้/sdcard/ไปยังตำแหน่งที่เข้าถึงได้ด้วยพื้นที่เก็บข้อมูลที่กำหนดขอบเขต- ย้ายไฟล์แอปส่วนตัวไปยังไดเรกทอรีที่
getExternalFilesDir()เมธอดแสดงผล - ย้ายไฟล์ที่ไม่ใช่ไฟล์สื่อที่แชร์ไปยังไดเรกทอรีย่อยที่กำหนดไว้สำหรับแอปของ
ไดเรกทอรี
Downloads/
- ย้ายไฟล์แอปส่วนตัวไปยังไดเรกทอรีที่
- นำไดเรกทอรีพื้นที่เก็บข้อมูลเดิมของแอปออกจากไดเรกทอรี
/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 ได้จากแหล่งข้อมูลต่อไปนี้