Android ใช้ระบบไฟล์ที่คล้ายกับระบบไฟล์แบบดิสก์ในแพลตฟอร์มอื่นๆ ระบบมีตัวเลือกมากมายให้คุณบันทึกข้อมูลแอป ดังนี้
- พื้นที่เก็บข้อมูลเฉพาะแอป: จัดเก็บไฟล์ที่มีไว้สำหรับการใช้งานของแอปเท่านั้น ไม่ว่าจะเป็นในไดเรกทอรีเฉพาะภายในวอลุ่มที่จัดเก็บข้อมูลภายในหรือไดเรกทอรีเฉพาะที่แตกต่างกันภายในพื้นที่เก็บข้อมูลภายนอก ใช้ไดเรกทอรีภายในพื้นที่เก็บข้อมูลภายในเพื่อบันทึกข้อมูลที่ละเอียดอ่อนซึ่งแอปอื่นๆ ไม่ควรเข้าถึง
- พื้นที่เก็บข้อมูลที่ใช้ร่วมกัน: จัดเก็บไฟล์ที่แอปของคุณตั้งใจจะแชร์กับแอปอื่นๆ ซึ่งรวมถึงสื่อ เอกสาร และไฟล์อื่นๆ
- ค่ากำหนด: จัดเก็บข้อมูลพื้นฐานแบบส่วนตัวในคู่คีย์-ค่า
- ฐานข้อมูล: จัดเก็บข้อมูลที่มีโครงสร้างในฐานข้อมูลส่วนตัวโดยใช้ไลบรารี Room Persistence
ลักษณะของตัวเลือกเหล่านี้สรุปไว้ในตารางต่อไปนี้
| ประเภทเนื้อหา | วิธีการเข้าถึง | สิทธิ์ที่จำเป็น | แอปอื่นๆ เข้าถึงได้ไหม | ไฟล์จะถูกนำออกเมื่อถอนการติดตั้งแอปไหม | |
|---|---|---|---|---|---|
| ไฟล์เฉพาะแอป | ไฟล์ที่มีไว้สำหรับการใช้งานแอปของคุณเท่านั้น | จากที่จัดเก็บข้อมูลภายใน getFilesDir() หรือ
getCacheDir()จากที่จัดเก็บข้อมูลภายนอก getExternalFilesDir() หรือ
getExternalCacheDir() |
ไม่จำเป็นสำหรับพื้นที่เก็บข้อมูลภายใน ไม่จำเป็นสำหรับพื้นที่เก็บข้อมูลภายนอกเมื่อใช้แอปในอุปกรณ์ที่ใช้ Android 4.4 (ระดับ API 19) ขึ้นไป |
ไม่ | ใช่ |
| สื่อ | ไฟล์สื่อที่แชร์ได้ (รูปภาพ ไฟล์เสียง วิดีโอ) | MediaStore API |
READ_EXTERNAL_STORAGE เมื่อเข้าถึงไฟล์ของแอปอื่นๆ ใน Android 11 (ระดับ API 30) ขึ้นไปREAD_EXTERNAL_STORAGE หรือ WRITE_EXTERNAL_STORAGE เมื่อเข้าถึงไฟล์ของแอปอื่นๆ ใน Android 10 (ระดับ API 29)ต้องมีสิทธิ์สำหรับไฟล์ทั้งหมดใน Android 9 (ระดับ API 28) หรือต่ำกว่า |
ได้ แต่แอปอื่นต้องมีสิทธิ์ READ_EXTERNAL_STORAGE |
ไม่ |
| เอกสารและไฟล์อื่นๆ | เนื้อหาประเภทอื่นๆ ที่แชร์ได้ รวมถึงไฟล์ที่ดาวน์โหลด | เฟรมเวิร์กการเข้าถึงพื้นที่เก็บข้อมูล | ไม่มี | ใช่ ผ่านเครื่องมือเลือกไฟล์ของระบบ | ไม่ |
| ค่ากำหนดของแอป | คู่คีย์-ค่า | ไลบรารี Jetpack Preferences | ไม่มี | ไม่ | ใช่ |
| ฐานข้อมูลในเครื่อง | ข้อมูลเชิงสัมพันธ์ที่มีโครงสร้างในอุปกรณ์ | ไลบรารี Room Persistence 1 | ไม่มี | ไม่ | ใช่ |
| ฐานข้อมูลที่โฮสต์ในระบบคลาวด์ | ข้อมูลที่ซิงค์ในอุปกรณ์หลายเครื่อง การทำงานร่วมกันแบบเรียลไทม์ | Cloud Firestore, Firebase SQL Connect | INTERNET |
ใช้เฉพาะแบ็กเอนด์ระบบคลาวด์ | ระบบจะลบแคช SDK แต่ข้อมูลในระบบคลาวด์จะยังคงอยู่ |
| พื้นที่เก็บข้อมูลออบเจ็กต์ที่โฮสต์ในระบบคลาวด์ | ข้อมูลที่ไม่มีโครงสร้าง (เช่น สื่อ ไฟล์ขนาดใหญ่ หรือข้อมูลสำรอง) | Cloud Storage for Firebase | INTERNET |
ใช้เฉพาะแบ็กเอนด์ระบบคลาวด์ | ระบบจะลบแคช SDK แต่ข้อมูลในระบบคลาวด์จะยังคงอยู่ |
1 หากต้องการซิงค์ฐานข้อมูล Room ในเครื่องระหว่างอุปกรณ์ต่างๆ ให้จับคู่ Room กับแบ็กเอนด์ระบบคลาวด์หรือพิจารณาโซลูชันการซิงค์ที่มีการจัดการ เช่น Firebase
โซลูชันที่คุณเลือกจะขึ้นอยู่กับความต้องการเฉพาะของคุณ ดังนี้
- ข้อมูลของคุณต้องใช้พื้นที่เท่าใด
- พื้นที่เก็บข้อมูลภายในมีพื้นที่จำกัดสำหรับข้อมูลเฉพาะแอป ใช้พื้นที่เก็บข้อมูลประเภทอื่นหากต้องการบันทึกข้อมูลจำนวนมาก
- การเข้าถึงข้อมูลต้องมีความน่าเชื่อถือเพียงใด
- หากฟังก์ชันพื้นฐานของแอปต้องใช้ข้อมูลบางอย่าง เช่น เมื่อแอปเริ่มทำงาน ให้วางข้อมูลไว้ในไดเรกทอรีที่จัดเก็บข้อมูลภายในหรือฐานข้อมูล ไฟล์เฉพาะแอปที่จัดเก็บไว้ในที่จัดเก็บข้อมูลภายนอกอาจเข้าถึงไม่ได้เสมอไป เนื่องจากอุปกรณ์บางเครื่องอนุญาตให้ผู้ใช้นำอุปกรณ์จริงที่สอดคล้องกับที่จัดเก็บข้อมูลภายนอกออกได้
- คุณต้องการจัดเก็บข้อมูลประเภทใด
- หากคุณมีข้อมูลที่มีความหมายเฉพาะสำหรับแอปของคุณ ให้ใช้พื้นที่เก็บข้อมูลเฉพาะแอป สำหรับเนื้อหาสื่อที่แชร์ได้ ให้ใช้พื้นที่เก็บข้อมูลที่ใช้ร่วมกันเพื่อให้แอปอื่นๆ เข้าถึงเนื้อหาได้ สำหรับข้อมูลที่มีโครงสร้าง ให้ใช้ค่ากำหนด (สำหรับข้อมูลคีย์-ค่า) หรือฐานข้อมูล (สำหรับข้อมูลที่มีมากกว่า 2 คอลัมน์)
- ข้อมูลควรเป็นข้อมูลส่วนตัวสำหรับแอปของคุณหรือไม่
- เมื่อจัดเก็บข้อมูลที่ละเอียดอ่อน ซึ่งเป็นข้อมูลที่แอปอื่นๆ ไม่ควรเข้าถึงได้ ให้ใช้ที่จัดเก็บข้อมูลภายใน ค่ากำหนด หรือฐานข้อมูล พื้นที่เก็บข้อมูลภายในมีประโยชน์เพิ่มเติมคือข้อมูลจะถูกซ่อนจากผู้ใช้
หมวดหมู่ของตำแหน่งที่ตั้งพื้นที่เก็บข้อมูล
Android มีตำแหน่งที่เก็บข้อมูลจริง 2 ประเภท ได้แก่ ที่เก็บข้อมูลภายในและที่เก็บข้อมูลภายนอก ในอุปกรณ์ส่วนใหญ่ พื้นที่เก็บข้อมูลภายในจะมีขนาดเล็กกว่าพื้นที่เก็บข้อมูลภายนอก อย่างไรก็ตาม พื้นที่เก็บข้อมูลภายในจะพร้อมใช้งานในอุปกรณ์ทุกเครื่องเสมอ จึงเป็นที่ที่เชื่อถือได้มากกว่าในการเก็บข้อมูลที่แอปของคุณต้องใช้
วอลุ่มแบบถอดได้ เช่น การ์ด SD จะปรากฏในระบบไฟล์เป็นส่วนหนึ่งของที่จัดเก็บข้อมูลภายนอก Android จะแสดงอุปกรณ์เหล่านี้โดยใช้เส้นทาง เช่น /sdcard
โดยค่าเริ่มต้น ระบบจะจัดเก็บแอปไว้ในที่จัดเก็บข้อมูลภายใน อย่างไรก็ตาม หาก APK มีขนาดใหญ่มาก คุณสามารถระบุค่ากำหนดภายในไฟล์ Manifest ของแอปเพื่อติดตั้งแอปในที่จัดเก็บข้อมูลภายนอกแทนได้ ดังนี้
<manifest ... android:installLocation="preferExternal"> ... </manifest>
สิทธิ์และการเข้าถึงพื้นที่เก็บข้อมูลภายนอก
Android กำหนดสิทธิ์ที่เกี่ยวข้องกับพื้นที่เก็บข้อมูลต่อไปนี้
READ_EXTERNAL_STORAGE,
WRITE_EXTERNAL_STORAGE
และ
MANAGE_EXTERNAL_STORAGE
ใน Android เวอร์ชันก่อนหน้า แอปต้องประกาศสิทธิ์ READ_EXTERNAL_STORAGE เพื่อเข้าถึงไฟล์ใดก็ตามที่อยู่นอกไดเรกทอรีเฉพาะแอปในพื้นที่เก็บข้อมูลภายนอก
นอกจากนี้ แอปยังต้องประกาศสิทธิ์ WRITE_EXTERNAL_STORAGE เพื่อเขียนลงในไฟล์ใดก็ตามที่อยู่นอกไดเรกทอรีเฉพาะแอป
Android เวอร์ชันใหม่ๆ จะพิจารณาวัตถุประสงค์ของไฟล์มากกว่าตำแหน่งของไฟล์ในการกำหนดความสามารถของแอปในการเข้าถึงและเขียนลงในไฟล์หนึ่งๆ โดยเฉพาะอย่างยิ่ง หากแอปของคุณกำหนดเป้าหมายเป็น Android 11 (ระดับ API 30) ขึ้นไป สิทธิ์ WRITE_EXTERNAL_STORAGE จะไม่มีผลต่อการเข้าถึงพื้นที่เก็บข้อมูลของแอป โมเดลพื้นที่เก็บข้อมูลตามวัตถุประสงค์นี้ช่วยปรับปรุงความเป็นส่วนตัวของผู้ใช้ เนื่องจากแอปจะได้รับสิทธิ์เข้าถึงเฉพาะพื้นที่ของระบบไฟล์ของอุปกรณ์ที่แอปใช้จริงเท่านั้น
Android 11 เปิดตัวสิทธิ์ MANAGE_EXTERNAL_STORAGE ซึ่งให้สิทธิ์การเขียนไฟล์นอกไดเรกทอรีเฉพาะแอปและ MediaStore ดูข้อมูลเพิ่มเติมเกี่ยวกับสิทธิ์นี้และเหตุผลที่แอปส่วนใหญ่ไม่จำเป็นต้องประกาศสิทธิ์เพื่อดำเนินการตามกรณีการใช้งานได้ในคำแนะนำเกี่ยวกับวิธีจัดการไฟล์ทั้งหมดในอุปกรณ์จัดเก็บข้อมูล
พื้นที่เก็บข้อมูลที่กำหนดขอบเขต
เพื่อให้ผู้ใช้ควบคุมไฟล์ของตนได้มากขึ้นและจำกัดความยุ่งเหยิงของไฟล์ แอปที่กำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) ขึ้นไปจะได้รับสิทธิ์เข้าถึงพื้นที่เก็บข้อมูลภายนอกที่กำหนดขอบเขต หรือพื้นที่เก็บข้อมูลที่กำหนดขอบเขตโดยค่าเริ่มต้น แอปดังกล่าวจะมีสิทธิ์เข้าถึงเฉพาะไดเรกทอรีเฉพาะแอปในพื้นที่เก็บข้อมูลภายนอก รวมถึงสื่อบางประเภทที่แอปสร้างขึ้น
ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต เว้นแต่แอปของคุณจำเป็นต้องเข้าถึงไฟล์ที่จัดเก็บไว้นอกไดเรกทอรีเฉพาะแอปและนอกไดเรกทอรีที่ API MediaStore สามารถเข้าถึงได้ หากจัดเก็บไฟล์เฉพาะแอปไว้ในที่จัดเก็บข้อมูลภายนอก คุณสามารถทำให้การใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตง่ายขึ้นได้โดยการวางไฟล์เหล่านี้ไว้ในไดเรกทอรีเฉพาะแอปในที่จัดเก็บข้อมูลภายนอก วิธีนี้จะช่วยให้แอปของคุณยังคงเข้าถึงไฟล์เหล่านี้ได้เมื่อเปิดใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต
หากต้องการเตรียมแอปให้พร้อมสำหรับพื้นที่เก็บข้อมูลที่กำหนดขอบเขต โปรดดูคู่มือกรณีการใช้งานและแนวทางปฏิบัติแนะนำสำหรับพื้นที่เก็บข้อมูล หากแอปของคุณมี Use Case อื่นที่พื้นที่เก็บข้อมูลที่กำหนดขอบเขตไม่ครอบคลุม ให้ส่งคำขอฟีเจอร์ คุณสามารถเลือกไม่ใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขตชั่วคราวได้
ดูไฟล์ในอุปกรณ์
หากต้องการดูไฟล์ที่จัดเก็บไว้ในอุปกรณ์ ให้ใช้เครื่องมือสำรวจไฟล์สำหรับอุปกรณ์ของ Android Studio
แหล่งข้อมูลเพิ่มเติม
โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับพื้นที่เก็บข้อมูลจากแหล่งข้อมูลต่อไปนี้