MediaStore API: คืออะไร ความสามารถ และการทำงานกับไฟล์มีเดียที่ใช้ร่วมกัน

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-07-10 เวลาอ่าน: 7 นาที

MediaStore API คืออินเทอร์เฟซ Android สำหรับเข้าถึงไฟล์มีเดียที่ใช้ร่วมกันของอุปกรณ์: รูปภาพ วิดีโอ เสียง และเอกสาร ต่างจากการเข้าถึงไฟล์โดยตรง MediaStore ทำงานผ่านฐานข้อมูลมีเดียแบบรวมศูนย์และผู้ให้บริการเนื้อหา ตามเอกสารของ Android Developers (2025) ตั้งแต่ Android 10 เป็นต้นมา API ได้กลายเป็นกลไกหลักในการทำงานกับมีเดีย แทนที่ READ_EXTERNAL_STORAGE ที่เลิกใช้งานแล้ว นักพัฒนาซอฟต์แวร์ใช้ MediaStore ในแกลเลอรี เครื่องเล่นเพลง กล้องถ่ายรูป และตัวจัดการไฟล์

ประเด็นสำคัญ

  • MediaStore คือผู้ให้บริการเนื้อหาระบบ Android สำหรับเข้าถึงไฟล์มีเดียที่ใช้ร่วมกันของอุปกรณ์
  • ฐานข้อมูลมีเดีย จะทำดัชนีรูปภาพ วิดีโอ และเสียงทั้งหมดบนอุปกรณ์แบบรวมศูนย์
  • Android 10 ทำให้ MediaStore เป็นวิธีเดียวในการเข้าถึงไฟล์มีเดียที่ใช้ร่วมกัน
  • ลิงก์ URI แทนที่เส้นทางไฟล์โดยตรง ทำให้การเข้าถึงปลอดภัย
  • สิทธิ์อนุญาต จะขอตามประเภทมีเดีย: READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO

MediaStore API คืออะไร?

MediaStore API คือผู้ให้บริการเนื้อหาระบบบนแพลตฟอร์ม Android ที่ออกแบบมาเพื่อทำดัชนี จัดเก็บ และให้การเข้าถึงไฟล์มีเดียของอุปกรณ์ API เป็นส่วนหนึ่งของ Android SDK และพร้อมใช้งานตั้งแต่ API Level 1

MediaStore ทำงานผ่านฐานข้อมูลมีเดียแบบครบวงจรที่สแกนอุปกรณ์โดยอัตโนมัติและรวบรวมข้อมูลเมตาของไฟล์มีเดียทั้งหมด ฐานข้อมูลจะถูกอัปเดตโดยระบบเมื่อมีการเพิ่ม แก้ไข หรือลบไฟล์ ดังนั้นแอปพลิเคชันจึงได้รับข้อมูลที่ทันสมัยโดยไม่ต้องสแกนด้วยตนเอง

ตารางหลักของ MediaStore คือ: Images (รูปภาพ), Video (วิดีโอ), Audio (เสียง) และ Files (ไฟล์ทั่วไป) แต่ละตารางประกอบด้วยคอลัมน์ที่มีข้อมูลเมตา: ชื่อ วันที่สร้าง ขนาด ชนิด MIME พิกัด GPS และคุณลักษณะอื่น ๆ

วิวัฒนาการของ MediaStore ในเวอร์ชัน Android

ก่อน 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 ทำงานอย่างไร: สถาปัตยกรรมและฐานข้อมูลมีเดีย

MediaStore สร้างขึ้นบนสถาปัตยกรรมผู้ให้บริการเนื้อหา: แต่ละแอปพลิเคชันเข้าถึงผ่าน ContentResolver และ Uri สแกนเนอร์มีเดียของระบบ — MediaScannerConnection — จะทำดัชนีไฟล์ทั้งหมดบนอุปกรณ์โดยอัตโนมัติเมื่อบูต เชื่อมต่อ USB หรือรีบูต

ฐานข้อมูลมีเดียถูกจัดเก็บในฐานข้อมูลระบบและมีระเบียนสำหรับไฟล์มีเดียแต่ละไฟล์ คอลัมน์แตกต่างกันตามประเภท: รูปภาพมี ORIENTATION และ DATE_TAKEN วิดีโอมี DURATION ไฟล์เสียงมี ARTIST และ ALBUM นักพัฒนาซอฟต์แวร์สามารถเรียกใช้คำสั่งแบบ SQL ผ่าน query ด้วย projection และ selection เพื่อกรอง

kotlin
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 URI เช่น content://media/external/images/media/1234 URI ภายนอกชี้ไปยังพื้นที่จัดเก็บที่ใช้ร่วมกัน ในขณะที่ URI ภายในชี้ไปยังไฟล์มีเดียของระบบ การใช้ URI แทนเส้นทางไฟล์เป็นข้อได้เปรียบสำคัญของ MediaStore: แอปพลิเคชันไม่จำเป็นต้องเข้าถึงระบบไฟล์และทำงานผ่านผู้ให้บริการเนื้อหาที่ปลอดภัย

ประเภทไฟล์มีเดียใน MediaStore

MediaStore รองรับมีเดียสี่ประเภทหลัก แต่ละประเภทมีตารางและชุดข้อมูลเมตาของตัวเอง นักพัฒนาซอฟต์แวร์เลือกตารางที่เหมาะสมตามประเภทเนื้อหาที่แอปพลิเคชันทำงานด้วย

  • MediaStore.Images — รูปภาพ ภาพหน้าจอ และภาพวาด คอลัมน์: BUCKET_DISPLAY_NAME, IS_PRIVATE, LATITUDE, LONGITUDE
  • MediaStore.Video — การบันทึกวิดีโอและภาพยนตร์ คอลัมน์: DURATION, RESOLUTION, IS_DRM
  • MediaStore.Audio — แทร็กเพลงและไฟล์เสียง คอลัมน์: ARTIST, ALBUM, COMPOSER, TRACK
  • MediaStore.Files — เอกสารและไฟล์อื่น ๆ พร้อมใช้งานตั้งแต่ Android 10 สำหรับการเข้าถึงที่ใช้ร่วมกัน

นอกเหนือจากคอลัมน์มาตรฐาน แต่ละตารางมีฟิลด์ระบบ: _ID, DATA (เลิกใช้งาน), SIZE, MIME_TYPE, DATE_ADDED, DATE_MODIFIED ตั้งแต่ Android 10 ฟิลด์ DATA ถูกทำเครื่องหมายว่าเลิกใช้งาน และนักพัฒนาซอฟต์แวร์ควรทำงานโดยเปิด InputStream ผ่าน URI

สิทธิ์อนุญาตสำหรับการทำงานกับ MediaStore

MediaStore ต้องการสิทธิ์อนุญาตที่ชัดเจน ซึ่งแตกต่างกันไปตามเวอร์ชัน Android ก่อน Android 13 ใช้สิทธิ์อนุญาต READ_EXTERNAL_STORAGE เพียงรายการเดียว เริ่มตั้งแต่ Android 13 (API 33) Google ได้แนะนำสิทธิ์อนุญาตแบบละเอียดสำหรับมีเดียแต่ละประเภท

ประเภทมีเดียสิทธิ์อนุญาต (API 33+)แบบเก่า (API 29–32)
รูปภาพREAD_MEDIA_IMAGESREAD_EXTERNAL_STORAGE
วิดีโอREAD_MEDIA_VIDEOREAD_EXTERNAL_STORAGE
เสียงREAD_MEDIA_AUDIOREAD_EXTERNAL_STORAGE
เขียนWRITE_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

การเขียนไปยัง MediaStore ยังต้องใช้ WRITE_EXTERNAL_STORAGE สำหรับ Android 9 และต่ำกว่า ตั้งแต่ Android 10 เป็นต้นไป แอปพลิเคชันสามารถเขียนไฟล์ของตนเองไปยัง MediaStore โดยไม่ต้องมีสิทธิ์อนุญาตเพิ่มเติม — ระบบจะให้สิทธิ์การเข้าถึงโดยอัตโนมัติเมื่อแทรกระเบียนผ่าน ContentResolver.insert

การขอสิทธิ์อนุญาตขณะรันไทม์

สิทธิ์อนุญาต MediaStore จะขอผ่านกลไกมาตรฐาน ActivityResultContracts.RequestMultiplePermissions ผู้ใช้อาจปฏิเสธคำขอ และแอปพลิเคชันควรจัดการกับสถานการณ์นี้อย่างถูกต้อง ขอแนะนำให้ตรวจสอบสิทธิ์อนุญาตผ่าน ContextCompat.checkSelfPermission ก่อนการเข้าถึง MediaStore แต่ละครั้ง

ตัวอย่างโค้ด: การอ่านและเขียนผ่าน MediaStore

MediaStore ไม่เพียงแต่อ่านได้เท่านั้น แต่ยังสามารถเขียนไฟล์มีเดียได้อีกด้วย ในการเขียนรูปภาพหรือวิดีโอ นักพัฒนาซอฟต์แวร์ใช้ ContentResolver.insert และเปิด OutputStream สำหรับ URI ที่ส่งคืน ระบบจะเพิ่มไฟล์ลงในฐานข้อมูลมีเดียโดยอัตโนมัติและทำดัชนี

kotlin
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 ->
        // เขียนไบต์ไปยังสตรีม
    }
}

การลบไฟล์มีเดียผ่าน MediaStore

การลบทำได้ผ่าน ContentResolver.delete พร้อม URI ของไฟล์ ระบบตรวจสอบสิทธิ์การเข้าถึง: หากไฟล์เป็นของแอปพลิเคชันปัจจุบัน การลบจะเกิดขึ้นโดยไม่ต้องมีสิทธิ์อนุญาตเพิ่มเติม สำหรับไฟล์ของแอปพลิเคชันอื่นบน Android 10+ จำเป็นต้องมีการยืนยันจากผู้ใช้ผ่านไดอะล็อกของระบบ

MediaStore กับการเข้าถึงไฟล์โดยตรง

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 คืออะไร?

MediaStore API คือผู้ให้บริการเนื้อหาระบบ Android สำหรับเข้าถึงไฟล์มีเดียของอุปกรณ์: รูปภาพ วิดีโอ เสียง และเอกสาร API ให้อินเทอร์เฟซแบบครบวงจรผ่าน ContentResolver และฐานข้อมูลมีเดียที่ทำดัชนีไฟล์ทั้งหมดโดยอัตโนมัติ

MediaStore รองรับมีเดียประเภทใดบ้าง?

MediaStore รองรับ Images (รูปภาพ), Video (วิดีโอ), Audio (เสียง) และ Files (เอกสาร) แต่ละประเภทมีตารางและชุดข้อมูลเมตาของตัวเอง: รูปภาพมี ORIENTATION วิดีโอมี DURATION ไฟล์เสียงมี ARTIST

ต้องใช้สิทธิ์อนุญาตอะไรบ้างสำหรับ MediaStore บน Android 13?

บน Android 13+ จะใช้สิทธิ์อนุญาตแบบละเอียด: READ_MEDIA_IMAGES สำหรับรูปภาพ READ_MEDIA_VIDEO สำหรับวิดีโอ และ READ_MEDIA_AUDIO สำหรับเสียง ผู้ใช้สามารถให้สิทธิ์การเข้าถึงเฉพาะมีเดียบางประเภทเท่านั้น

จะเขียนไฟล์ผ่าน MediaStore ได้อย่างไร?

ในการเขียน ให้สร้าง ContentValues ด้วยชื่อและชนิด MIME เรียก ContentResolver.insert เพื่อรับ URI จากนั้นเปิด OutputStream ผ่าน ContentResolver.openOutputStream ระบบจะทำดัชนีไฟล์ใหม่โดยอัตโนมัติ

MediaStore แตกต่างจาก Storage Access Framework อย่างไร?

MediaStore ให้การเข้าถึงไฟล์มีเดียทั้งหมดของอุปกรณ์โดยทางโปรแกรมผ่านฐานข้อมูลมีเดีย Storage Access Framework เปิดไดอะล็อกเลือกระบบและส่งคืน URI — ผู้ใช้เลือกไฟล์หรือโฟลเดอร์ที่เฉพาะเจาะจง

สรุป

  • MediaStore API คือกลไกหลักในการเข้าถึงไฟล์มีเดีย Android ซึ่งทำงานผ่านผู้ให้บริการเนื้อหาและฐานข้อมูลมีเดีย
  • ฐานข้อมูลมีเดีย ทำดัชนีรูปภาพ วิดีโอ เสียง และเอกสารโดยอัตโนมัติ ให้การเข้าถึงข้อมูลเมตาผ่าน ContentResolver
  • Android 10 ทำให้ MediaStore เป็นวิธีเดียวในการเข้าถึงไฟล์มีเดียที่ใช้ร่วมกัน โดยจำกัดการเข้าถึงไฟล์โดยตรง
  • Android 13 แนะนำสิทธิ์อนุญาตแบบละเอียด READ_MEDIA_IMAGES, READ_MEDIA_VIDEO และ READ_MEDIA_AUDIO แทน READ_EXTERNAL_STORAGE เพียงรายการเดียว
  • Content URI แทนที่เส้นทางไฟล์ ทำให้การเข้าถึงไฟล์ของแอปพลิเคชันอื่นปลอดภัยโดยไม่ต้องมีสิทธิ์รูท
  • การเขียนผ่าน MediaStore ทำได้ผ่าน ContentResolver.insert และ openOutputStream พร้อมการทำดัชนีอัตโนมัติในฐานข้อมูลมีเดีย
  • การเลือก ระหว่าง MediaStore และ SAF ขึ้นอยู่กับงาน: MediaStore สำหรับการดำเนินการมีเดียเป็นชุด SAF สำหรับการเลือกไฟล์เดี่ยวโดยผู้ใช้

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม