โมดูล 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ให้ตั้งค่า FlagVolumeInfo.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