ภาพรวมของพื้นที่เก็บข้อมูลและไฟล์

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

แหล่งข้อมูลเพิ่มเติม

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับพื้นที่เก็บข้อมูลจากแหล่งข้อมูลต่อไปนี้

วิดีโอ