โมดูล 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 BYAPI สาธารณะใหม่สำหรับใช้กับคอลัมน์ข้อมูลเมตาเพิ่มเติมที่ไม่ได้กล่าวถึงข้างต้น
การปรับปรุง
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 ใน APEX
การขึ้นต่อกัน
Dependency ของ MediaProvider เกี่ยวข้องกับการปรับแต่ง (กล่าวคือ หากคุณปรับแต่ง MediaProvider คุณต้องตรวจสอบว่าการติดตั้งใช้งานเป็นไปตาม Dependency ที่เชื่อมโยงกับการปรับแต่ง)
เมื่อใช้รูปแบบไฟล์สื่อที่กำหนดเองหรือไม่เป็นไปตามมาตรฐาน (เช่น รูปแบบที่สร้างโดยแอปกล้องที่เฉพาะเจาะจงของผู้ให้บริการ) คุณต้องลงทะเบียนแต่ละรูปแบบที่กำหนดเองกับ
MimeUtilsและโมดูล Media Extractor เพื่อให้ MediaProvider ทำการจัดทำดัชนีได้หากต้องการให้ MediaProvider จัดทำดัชนีชุดอุปกรณ์จัดเก็บข้อมูลที่กำหนดเอง (เช่น ช่องเสียบการ์ด SD และพอร์ต USB) ที่ใช้ในการติดตั้งใช้งาน
StorageManagerServiceให้ตั้งค่าแฟล็กVolumeInfo.MOUNT_FLAG_INDEXABLEเมื่อใช้การติดตั้งใช้งาน MTP ที่กำหนดเอง (ไม่ใช่ AOSP) ให้ตรวจสอบว่าการติดตั้งใช้งาน ใช้เฉพาะ API สาธารณะและ API ของระบบเพื่อให้การติดตั้งใช้งาน โต้ตอบกับ MediaStore ได้
การปรับแต่ง
คุณสามารถเพิ่มรูปแบบสื่อใหม่ๆ มีอิทธิพลต่ออุปกรณ์จัดเก็บข้อมูลที่ได้รับการจัดทำดัชนี แทนที่สแต็ก MTP และยกเว้นไม่ให้สร้างโฟลเดอร์เริ่มต้น
รูปแบบสื่อที่กำหนดเอง สำหรับรูปแบบสื่อที่กำหนดเองใหม่แต่ละรูปแบบ คุณต้องระบุ การแมประหว่างนามสกุลไฟล์ที่ไม่ซ้ำกับประเภท MIME เราขอแนะนำ ให้คุณทำตามกระบวนการลงทะเบียน IANA
คุณไม่สามารถกำหนดส่วนขยายหรือ MIME ประเภทที่กำหนดไว้แล้วใน AOSP ใหม่ได้
สำหรับไฟล์
video/*และaudio/*MediaProvider จะยังคงปรึกษาMediaMetadataRetrieverต่อไป ใช้ Media Extractors ของ Android 10 เพื่อแสดงผล ข้อมูลเมตาสำหรับรูปแบบที่กำหนดเองสำหรับไฟล์
image/*MediaProvider จะยังคงใช้Exifเป็นมาตรฐานสำหรับ ข้อมูลเมตา คุณสามารถขยายandroid.media.ExifInterfaceเพื่อดึงและแสดงผลข้อมูลเมตาExifสำหรับรูปแบบรูปภาพที่กำหนดเองได้
แฟล็กการจัดทำดัชนีอุปกรณ์จัดเก็บข้อมูล MediaProvider จะจัดทำดัชนีไดรฟ์ข้อมูลทั้งหมดที่
StorageManager.getStorageVolumes()ส่งคืน โดยที่StorageVolume.getMediaStoreVolumeName()ไม่ใช่ค่าว่าง คุณปรับแต่งรายการโวลุ่มที่แสดงผลเพื่อกำหนดสิ่งที่จัดทำดัชนีได้ แต่เราไม่แนะนำให้รวมโวลุ่มชั่วคราว (เช่น ไดรฟ์ USB OTG)การแทนที่สแต็ก MTP Android 11 จะวางสแต็ก MTP ไว้ภายนอกขอบเขตของโมดูลทั้งหมด และตรวจสอบว่าสแต็กทำงานกับ API สาธารณะ
รายการการยกเว้นโฟลเดอร์เริ่มต้น MediaProvider จะสร้างโฟลเดอร์เริ่มต้น
Music/,Podcasts/,Ringtones/,Alarms/,Notifications/,Pictures/Movies/,Download/,DCIM/,Documents/,Audiobooks/และRecordings/(ไดเรกทอรีRecordings/ไม่พร้อมใช้งานใน Android 11 และต่ำกว่า) สำหรับวอลุ่มพื้นที่เก็บข้อมูลที่ติดตั้งใหม่ ใน Android 12 ขึ้นไป ผู้ผลิตอุปกรณ์ดั้งเดิม (OEM) สามารถระบุรายการยกเว้นที่ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่สำหรับโฟลเดอร์ที่ MediaProvider ควรข้ามระหว่างการสร้างเริ่มต้นได้ โฟลเดอร์เหล่านี้ เช่น โฟลเดอร์Download/อาจยังคงสร้างขึ้นโดยตรรกะภายนอก
หากต้องการเพิ่มรายการยกเว้น ให้ใช้config_foldersToSkipInDefaultCreation
การซ้อนทับทรัพยากรขณะรันไทม์ (RRO) ตัวอย่างวิธียกเว้นโฟลเดอร์เริ่มต้น Notifications/ และ Ringtones/ มีดังนี้
<string-array name="config_foldersToSkipInDefaultCreation" translatable="false">
<item>"Notifications"</item>
<item>"Ringtones"</item>
</string-array>
การทดสอบ
คุณตรวจสอบฟังก์ชันการทำงานของ MediaProvider ได้โดยใช้การทดสอบต่อไปนี้
หากต้องการยืนยันฟังก์ชันการทำงานของ API สาธารณะ MediaStore ให้ใช้การทดสอบใน
CtsProviderTestCasesแพ็กเกจของชุดเครื่องมือทดสอบความเข้ากันได้ (CTS) ของ Androidหากต้องการยืนยันฟังก์ชันการทำงานของส่วนประกอบภายในของ MediaProvider ให้ใช้การทดสอบใน
MediaProviderTests
หากต้องการเรียกใช้การทดสอบทั้ง 2 ชุดพร้อมกัน ให้ใช้คำสั่ง atest ต่อไปนี้
atest --test-mapping packages/providers/MediaProvider