โมดูล MediaProvider ปรับข้อมูลเมตาที่จัดทำดัชนีให้เหมาะสม (เสียง วิดีโอ และรูปภาพจากการ์ด SD และอุปกรณ์ USB) และทำให้ข้อมูลนั้นพร้อมใช้งานสำหรับแอปผ่าน API สาธารณะของ MediaStore เพื่อรักษาความเป็นส่วนตัวของผู้ใช้ โมดูล MediaProvider จะบังคับใช้ โมเดลความปลอดภัยในการจัดเก็บข้อมูลที่กำหนดขอบเขต ซึ่งเปิดตัวใน Android 10 ซึ่งรวมถึงการแก้ไขข้อมูลเมตาของตำแหน่งที่ละเอียดอ่อนด้วย โมดูลนี้สามารถอัปเดตได้ ช่วยให้ Android ตอบสนองต่อปัญหาด้านความปลอดภัยได้เร็วขึ้น (ปกป้องข้อมูลผู้ใช้ที่ละเอียดอ่อน) และเพิ่มรูปแบบสื่อใหม่ได้รวดเร็วยิ่งขึ้น (ให้ความสอดคล้องกันทั้งผู้ใช้และนักพัฒนา)
การเปลี่ยนแปลงใน Android 10
Android 10 นำเสนอการปรับปรุงหลายประการที่เกี่ยวข้องกับการระบุและแยกข้อมูลจากไฟล์สื่อ โดยเฉพาะ:
การกำหนดประเภทเนื้อหาไฟล์โดยใช้ส่วนแรกของประเภท MIME ของไฟล์ ตัวอย่างเช่น ระบบปฏิบัติการรู้ว่าทั้ง
image/png
และimage/x-newly-invented-format
เป็นรูปภาพ และสามารถอธิบายสิทธิ์ที่เกี่ยวข้องให้กับผู้ใช้ปลายทางได้อย่างถูกต้องการกำหนดประเภท MIME โดยใช้นามสกุลไฟล์เท่านั้น (และไม่ใช้ การดมเนื้อหา เพื่อหลีกเลี่ยงปัญหาด้านความปลอดภัย)
การกำหนดประเภท MIME ของไฟล์ที่กำหนดเองโดยใช้การผสมผสานระหว่าง การแมป Debian Linux และ Android แบบอัปสตรีม
ส่งคืนข้อมูลที่เกี่ยวข้องจากไฟล์
video/*
และaudio/*
(ผ่านMediaMetadataRetriever
) และไฟล์image/*
(ผ่านExifInterface
)
การเปลี่ยนแปลงใน Android 11
ใน Android 11 โมดูล MediaProvider สร้างขึ้นจากการเปลี่ยนแปลงที่เกิดขึ้นใน Android 10 โดยมีการปรับปรุงต่อไปนี้:
การปรับปรุงการจัดทำดัชนี ขณะนี้โมดูล MediaProvider จัดทำดัชนีข้อมูลเมตาโดยการกระทบยอดข้อมูลเมตาที่มีอยู่กับ API สาธารณะของ MediaStore การเปลี่ยนแปลงได้แก่:
คอลัมน์
is_favorite
ใหม่และอาร์กิวเมนต์QUERY_ARG_MATCH_FAVORITE
ใหม่เพื่อให้แอปสไตล์แกลเลอรีสามารถกรองสื่อตามคอลัมน์นี้ได้อย่างรวดเร็วการทำดัชนีข้อมูลเมตาของพื้นที่สี
คอลัมน์ 'is_trashed' ใหม่ และอาร์กิวเมนต์
QUERY_ARG_MATCH_TRASHED
เพื่อเปิดใช้งานแอปสไตล์แกลเลอรีเพื่อกรองตามคอลัมน์นี้API ใหม่ที่ช่วยให้สามารถแก้ไขรายการหลายรายการพร้อมกันได้โดยใช้กล่องโต้ตอบพร้อมท์สำหรับผู้ใช้เพียงรายเดียว รวมถึง
createDeleteRequest()
,createFavoriteRequest()
,createTrashRequest()
และcreateWriteRequest()
คอลัมน์
GENERATION_ADDED
และGENERATION_MODIFIED
ใหม่เพื่อใช้ในการตรวจจับการเปลี่ยนแปลงที่เกิดขึ้นนับตั้งแต่จุดการซิงโครไนซ์ครั้งก่อนอย่างรวดเร็วและเชื่อถือได้ใหม่
GROUP BY
API สาธารณะเพื่อใช้กับคอลัมน์ข้อมูลเมตาเพิ่มเติมที่ไม่ได้กล่าวถึงข้างต้น
การปรับปรุง
ExifInterface
เพื่อแยกข้อมูลเมตาจากคอนเทนเนอร์ PNG และ WebPการปรับปรุง
SystemUI
เพื่อเขียนข้อมูลเมตาDateTimeOriginal
ในการจับภาพหน้าจอ
นอกจากนี้ คุณยังสามารถปรับแต่ง MediaProvider ได้ด้วยการเพิ่มรูปแบบสื่อใหม่ ทำเครื่องหมายว่าอุปกรณ์จัดเก็บข้อมูลใดที่ควรจัดทำดัชนี และแม้กระทั่งแทนที่สแตก MTP สำหรับรายละเอียด โปรดดูที่ การปรับแต่ง
ขอบเขตโมดูล
Android 11 ย้ายโค้ดทั้งหมดใน packages/providers/MediaProvider
ไปยังตำแหน่งใหม่ โดยมีข้อยกเว้นที่น่าสังเกตคือตรรกะที่เกี่ยวข้องกับ MTP นอกจากนี้ frameworks/base/core/java/android/provider/MediaStore.java
ขณะนี้อยู่ ภายใน ขอบเขตโมดูลที่ packages/providers/MediaProvider
รูปแบบแพ็คเกจ
โมดูล MediaProvider อยู่ในรูปแบบ APK-in-APEX
การพึ่งพาอาศัยกัน
การขึ้นต่อกันของ MediaProvider เกี่ยวข้องกับ การปรับแต่ง (นั่นคือ หากคุณปรับแต่ง MediaProvider คุณต้องแน่ใจว่าการใช้งานของคุณเป็นไปตามการขึ้นต่อกันที่เกี่ยวข้องกับการปรับแต่งของคุณ)
เมื่อใช้รูปแบบไฟล์สื่อที่กำหนดเองหรือไม่เป็นมาตรฐาน (เช่น รูปแบบที่สร้างโดยแอพกล้องเฉพาะของผู้จำหน่าย) คุณต้องลงทะเบียนรูปแบบที่กำหนดเองแต่ละรูปแบบกับ
MimeUtils
และโมดูล Media Extractor เพื่อเปิดใช้งานการสร้างดัชนีโดย MediaProviderเพื่อให้แน่ใจว่า MediaProvider จัดทำดัชนีชุดอุปกรณ์จัดเก็บข้อมูลแบบกำหนดเอง (เช่น ช่องเสียบการ์ด SD และพอร์ต USB) ที่ใช้ในการใช้งาน
StorageManagerService
ให้ตั้งค่าแฟล็กVolumeInfo.MOUNT_FLAG_INDEXABLE
เมื่อใช้การใช้งาน MTP แบบกำหนดเอง (ไม่ใช่ AOSP) ตรวจสอบให้แน่ใจว่าการใช้งานนั้นอาศัย API สาธารณะและของระบบเพียงอย่างเดียวเพื่อให้การใช้งานโต้ตอบกับ MediaStore
การปรับแต่ง
ตอนนี้คุณสามารถเพิ่มรูปแบบสื่อใหม่ กำหนดอุปกรณ์จัดเก็บข้อมูลที่จะทำดัชนี และแทนที่สแตก MTP
รูปแบบสื่อที่กำหนดเอง สำหรับสื่อแบบกำหนดเองใหม่แต่ละรูปแบบ คุณต้องจัดเตรียมการแมปจากนามสกุลไฟล์ที่ไม่ซ้ำกับประเภท MIME เราขอแนะนำให้คุณปฏิบัติตาม ขั้นตอนการลงทะเบียนของ IANA
คุณไม่สามารถกำหนดส่วนขยายหรือประเภท MIME ที่กำหนดไว้แล้วใน AOSP ใหม่ได้
สำหรับไฟล์
video/*
และaudio/*
MediaProvider จะให้คำปรึกษากับMediaMetadataRetriever
ต่อไป ใช้ Android 10 Media Extractors เพื่อส่งคืนข้อมูลเมตาสำหรับรูปแบบที่กำหนดเองสำหรับไฟล์
image/*
MediaProvider ยังคงสร้างมาตรฐานให้กับExif
สำหรับข้อมูลเมตาต่อไป คุณสามารถขยายandroid.media.ExifInterface
เพื่อแยกและส่งคืนข้อมูลเมตาExif
สำหรับรูปแบบรูปภาพที่กำหนดเองได้
อุปกรณ์จัดเก็บข้อมูลแฟล็กการจัดทำดัชนี MediaProvider จัดทำดัชนีวอลุ่มทั้งหมดที่ส่งคืนโดย
StorageManager.getStorageVolumes()
โดยที่StorageVolume.getMediaStoreVolumeName()
ไม่ใช่ค่าว่าง คุณสามารถปรับแต่งรายการวอลุ่มที่ส่งคืนเพื่อให้ส่งผลต่อสิ่งที่จัดทำดัชนีได้ แต่เราขอแนะนำไม่ให้รวมวอลุ่มชั่วคราว (เช่น ไดรฟ์ USB OTG)การเปลี่ยนสแต็ก MTP Android 11 วางสแต็ก MTP ไว้นอกขอบเขตโมดูลโดยสิ้นเชิง และรับประกันว่าจะทำงานกับ API สาธารณะได้
การทดสอบ
คุณสามารถตรวจสอบการทำงานของ MediaProvider ได้โดยใช้การทดสอบต่อไปนี้:
หากต้องการตรวจสอบการทำงานของ API สาธารณะของ MediaStore ให้ใช้การทดสอบในแพ็คเกจ
CtsProviderTestCases
ของชุดทดสอบความเข้ากันได้ของ Android (CTS)หากต้องการตรวจสอบการทำงานของ MediaProvider ภายใน ให้ใช้การทดสอบใน
MediaProviderTests
หากต้องการรันการทดสอบทั้งสองชุดพร้อมกัน ให้ใช้คำสั่ง atest
ต่อไปนี้:
atest --test-mapping packages/providers/MediaProvider