MediaStore API คืออินเทอร์เฟซ Android สำหรับเข้าถึงไฟล์มีเดียที่ใช้ร่วมกันของอุปกรณ์: รูปภาพ วิดีโอ เสียง และเอกสาร ต่างจากการเข้าถึงไฟล์โดยตรง MediaStore ทำงานผ่านฐานข้อมูลมีเดียแบบรวมศูนย์และผู้ให้บริการเนื้อหา ตามเอกสารของ Android Developers (2025) ตั้งแต่ Android 10 เป็นต้นมา API ได้กลายเป็นกลไกหลักในการทำงานกับมีเดีย แทนที่ READ_EXTERNAL_STORAGE ที่เลิกใช้งานแล้ว นักพัฒนาซอฟต์แวร์ใช้ MediaStore ในแกลเลอรี เครื่องเล่นเพลง กล้องถ่ายรูป และตัวจัดการไฟล์
ประเด็นสำคัญ
MediaStore API คือผู้ให้บริการเนื้อหาระบบบนแพลตฟอร์ม Android ที่ออกแบบมาเพื่อทำดัชนี จัดเก็บ และให้การเข้าถึงไฟล์มีเดียของอุปกรณ์ API เป็นส่วนหนึ่งของ Android SDK และพร้อมใช้งานตั้งแต่ API Level 1
MediaStore ทำงานผ่านฐานข้อมูลมีเดียแบบครบวงจรที่สแกนอุปกรณ์โดยอัตโนมัติและรวบรวมข้อมูลเมตาของไฟล์มีเดียทั้งหมด ฐานข้อมูลจะถูกอัปเดตโดยระบบเมื่อมีการเพิ่ม แก้ไข หรือลบไฟล์ ดังนั้นแอปพลิเคชันจึงได้รับข้อมูลที่ทันสมัยโดยไม่ต้องสแกนด้วยตนเอง
ตารางหลักของ MediaStore คือ: Images (รูปภาพ), Video (วิดีโอ), Audio (เสียง) และ Files (ไฟล์ทั่วไป) แต่ละตารางประกอบด้วยคอลัมน์ที่มีข้อมูลเมตา: ชื่อ วันที่สร้าง ขนาด ชนิด MIME พิกัด GPS และคุณลักษณะอื่น ๆ
ก่อน Android 10 นักพัฒนาซอฟต์แวร์ใช้ READ_EXTERNAL_STORAGE เพื่อเข้าถึงไฟล์อุปกรณ์ทั้งหมด Android 10 (API 29) ได้แนะนำ Scoped Storage: แอปพลิเคชันสามารถเข้าถึงได้เฉพาะไฟล์ของตนเองและผ่าน MediaStore เท่านั้น Android 11 ได้ทำให้แนวนโยบายเข้มงวดยิ่งขึ้น โดยปิดกั้นเส้นทางโดยตรงไปยังไดเรกทอรีที่ใช้ร่วมกันอย่างสมบูรณ์
เริ่มตั้งแต่ Android 13 (API 33) Google ได้แทนที่ READ_EXTERNAL_STORAGE ด้วยสิทธิ์อนุญาตแบบละเอียด: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO และ READ_MEDIA_AUDIO ซึ่งช่วยให้ผู้ใช้สามารถให้สิทธิ์การเข้าถึงเฉพาะมีเดียบางประเภทโดยไม่เปิดเผยพื้นที่จัดเก็บทั้งหมด
MediaStore สร้างขึ้นบนสถาปัตยกรรมผู้ให้บริการเนื้อหา: แต่ละแอปพลิเคชันเข้าถึงผ่าน ContentResolver และ Uri สแกนเนอร์มีเดียของระบบ — MediaScannerConnection — จะทำดัชนีไฟล์ทั้งหมดบนอุปกรณ์โดยอัตโนมัติเมื่อบูต เชื่อมต่อ USB หรือรีบูต
ฐานข้อมูลมีเดียถูกจัดเก็บในฐานข้อมูลระบบและมีระเบียนสำหรับไฟล์มีเดียแต่ละไฟล์ คอลัมน์แตกต่างกันตามประเภท: รูปภาพมี ORIENTATION และ DATE_TAKEN วิดีโอมี DURATION ไฟล์เสียงมี ARTIST และ ALBUM นักพัฒนาซอฟต์แวร์สามารถเรียกใช้คำสั่งแบบ SQL ผ่าน query ด้วย projection และ selection เพื่อกรอง
val projection = arrayOf(
MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME,
MediaStore.Images.Media.DATE_ADDED
)
val cursor = contentResolver.query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection,
null,
null,
MediaStore.Images.Media.DATE_ADDED + " DESC"
)
cursor?.use {
while (moveToNext()) {
val name = getString(getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))
}
}
ไฟล์มีเดียแต่ละไฟล์ถูกระบุด้วย Content URI เช่น content://media/external/images/media/1234 URI ภายนอกชี้ไปยังพื้นที่จัดเก็บที่ใช้ร่วมกัน ในขณะที่ URI ภายในชี้ไปยังไฟล์มีเดียของระบบ การใช้ URI แทนเส้นทางไฟล์เป็นข้อได้เปรียบสำคัญของ MediaStore: แอปพลิเคชันไม่จำเป็นต้องเข้าถึงระบบไฟล์และทำงานผ่านผู้ให้บริการเนื้อหาที่ปลอดภัย
MediaStore รองรับมีเดียสี่ประเภทหลัก แต่ละประเภทมีตารางและชุดข้อมูลเมตาของตัวเอง นักพัฒนาซอฟต์แวร์เลือกตารางที่เหมาะสมตามประเภทเนื้อหาที่แอปพลิเคชันทำงานด้วย
นอกเหนือจากคอลัมน์มาตรฐาน แต่ละตารางมีฟิลด์ระบบ: _ID, DATA (เลิกใช้งาน), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED ตั้งแต่ Android 10 ฟิลด์ DATA ถูกทำเครื่องหมายว่าเลิกใช้งาน และนักพัฒนาซอฟต์แวร์ควรทำงานโดยเปิด InputStream ผ่าน URI
MediaStore ต้องการสิทธิ์อนุญาตที่ชัดเจน ซึ่งแตกต่างกันไปตามเวอร์ชัน Android ก่อน Android 13 ใช้สิทธิ์อนุญาต READ_EXTERNAL_STORAGE เพียงรายการเดียว เริ่มตั้งแต่ Android 13 (API 33) Google ได้แนะนำสิทธิ์อนุญาตแบบละเอียดสำหรับมีเดียแต่ละประเภท
| ประเภทมีเดีย | สิทธิ์อนุญาต (API 33+) | แบบเก่า (API 29–32) |
|---|---|---|
| รูปภาพ | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| วิดีโอ | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| เสียง | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| เขียน | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
การเขียนไปยัง MediaStore ยังต้องใช้ WRITE_EXTERNAL_STORAGE สำหรับ Android 9 และต่ำกว่า ตั้งแต่ Android 10 เป็นต้นไป แอปพลิเคชันสามารถเขียนไฟล์ของตนเองไปยัง MediaStore โดยไม่ต้องมีสิทธิ์อนุญาตเพิ่มเติม — ระบบจะให้สิทธิ์การเข้าถึงโดยอัตโนมัติเมื่อแทรกระเบียนผ่าน ContentResolver.insert
สิทธิ์อนุญาต MediaStore จะขอผ่านกลไกมาตรฐาน ActivityResultContracts.RequestMultiplePermissions ผู้ใช้อาจปฏิเสธคำขอ และแอปพลิเคชันควรจัดการกับสถานการณ์นี้อย่างถูกต้อง ขอแนะนำให้ตรวจสอบสิทธิ์อนุญาตผ่าน ContextCompat.checkSelfPermission ก่อนการเข้าถึง MediaStore แต่ละครั้ง
MediaStore ไม่เพียงแต่อ่านได้เท่านั้น แต่ยังสามารถเขียนไฟล์มีเดียได้อีกด้วย ในการเขียนรูปภาพหรือวิดีโอ นักพัฒนาซอฟต์แวร์ใช้ ContentResolver.insert และเปิด OutputStream สำหรับ URI ที่ส่งคืน ระบบจะเพิ่มไฟล์ลงในฐานข้อมูลมีเดียโดยอัตโนมัติและทำดัชนี
val values = ContentValues().apply {
put(MediaStore.Images.Media.DISPLAY_NAME, "photo_2025.jpg")
put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp")
}
val uri = contentResolver?.insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
)
uri?.let {
val outputStream = contentResolver?.openOutputStream(it)
outputStream?.use { stream ->
// เขียนไบต์ไปยังสตรีม
}
}
การลบทำได้ผ่าน ContentResolver.delete พร้อม URI ของไฟล์ ระบบตรวจสอบสิทธิ์การเข้าถึง: หากไฟล์เป็นของแอปพลิเคชันปัจจุบัน การลบจะเกิดขึ้นโดยไม่ต้องมีสิทธิ์อนุญาตเพิ่มเติม สำหรับไฟล์ของแอปพลิเคชันอื่นบน Android 10+ จำเป็นต้องมีการยืนยันจากผู้ใช้ผ่านไดอะล็อกของระบบ
MediaStore API แตกต่างโดยพื้นฐานจากการเข้าถึงไฟล์โดยตรงผ่าน File API แทนที่จะใช้เส้นทางไฟล์ จะใช้ Content URI และแทนที่จะใช้การดำเนินการกับไฟล์ จะใช้เมธอด ContentResolver ซึ่งให้ข้อได้เปรียบสำคัญสามประการ: ความปลอดภัย การทำดัชนีอัตโนมัติ และอินเทอร์เฟซแบบครบวงจร
การเข้าถึงไฟล์โดยตรงถูกจำกัดบน Android 10+ สำหรับไดเรกทอรีที่ใช้ร่วมกัน MediaStore ยังคงเป็นวิธีเดียวในการอ่านมีเดียจาก Pictures, DCIM, Movies, Music และ Download สำหรับไฟล์เฉพาะแอปพลิเคชัน (app-specific storage) การเข้าถึงโดยตรงยังคงมีอยู่ — ได้แก่ โฟลเดอร์ใน Android/data และ Android/media
การเลือกระหว่าง MediaStore และการเข้าถึงโดยตรงขึ้นอยู่กับประเภทเนื้อหา MediaStore เป็นสิ่งจำเป็นสำหรับไฟล์มีเดียที่ใช้ร่วมกันซึ่งแอปพลิเคชันอื่นสามารถเข้าถึงได้ File API โดยตรงเหมาะสำหรับไฟล์ภายในของแอปพลิเคชันและแคช Storage Access Framework ใช้สำหรับเลือกเอกสารตามอำเภอใจผ่านตัวเลือกระบบ
คำถามที่พบบ่อย
MediaStore API คือผู้ให้บริการเนื้อหาระบบ Android สำหรับเข้าถึงไฟล์มีเดียของอุปกรณ์: รูปภาพ วิดีโอ เสียง และเอกสาร API ให้อินเทอร์เฟซแบบครบวงจรผ่าน ContentResolver และฐานข้อมูลมีเดียที่ทำดัชนีไฟล์ทั้งหมดโดยอัตโนมัติ
MediaStore รองรับ Images (รูปภาพ), Video (วิดีโอ), Audio (เสียง) และ Files (เอกสาร) แต่ละประเภทมีตารางและชุดข้อมูลเมตาของตัวเอง: รูปภาพมี ORIENTATION วิดีโอมี DURATION ไฟล์เสียงมี ARTIST
บน Android 13+ จะใช้สิทธิ์อนุญาตแบบละเอียด: READ_MEDIA_IMAGES สำหรับรูปภาพ READ_MEDIA_VIDEO สำหรับวิดีโอ และ READ_MEDIA_AUDIO สำหรับเสียง ผู้ใช้สามารถให้สิทธิ์การเข้าถึงเฉพาะมีเดียบางประเภทเท่านั้น
ในการเขียน ให้สร้าง ContentValues ด้วยชื่อและชนิด MIME เรียก ContentResolver.insert เพื่อรับ URI จากนั้นเปิด OutputStream ผ่าน ContentResolver.openOutputStream ระบบจะทำดัชนีไฟล์ใหม่โดยอัตโนมัติ
MediaStore ให้การเข้าถึงไฟล์มีเดียทั้งหมดของอุปกรณ์โดยทางโปรแกรมผ่านฐานข้อมูลมีเดีย Storage Access Framework เปิดไดอะล็อกเลือกระบบและส่งคืน URI — ผู้ใช้เลือกไฟล์หรือโฟลเดอร์ที่เฉพาะเจาะจง
สรุป
เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร
IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ
อ่านเพิ่มเติม