โมดูล MediaProvider

โมดูล 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 ใน 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 ต่อไป ใช้โปรแกรมแยกสื่อของ Android 10 เพื่อแสดงข้อมูลเมตาสำหรับรูปแบบที่กำหนดเอง

    • สำหรับไฟล์ image/* MediaProvider จะยังคงใช้ Exif เป็นมาตรฐานสำหรับ ข้อมูลเมตา คุณสามารถขยาย android.media.ExifInterface เพื่อดึงและแสดงผลข้อมูลเมตา Exif สำหรับรูปแบบรูปภาพที่กำหนดเองได้

  • แฟล็กการจัดทำดัชนีอุปกรณ์จัดเก็บข้อมูล MediaProvider จะจัดทำดัชนีไดรฟ์ข้อมูลทั้งหมดที่ StorageManager.getStorageVolumes() ส่งคืน โดยที่ StorageVolume.getMediaStoreVolumeName() ไม่ใช่ค่าว่าง คุณปรับแต่งรายการโวลุ่มที่แสดงผลเพื่อกำหนดสิ่งที่จัดทำดัชนีได้ แต่เราไม่แนะนำให้รวมโวลุ่มชั่วคราว (เช่น ไดรฟ์ USB OTG)

  • การแทนที่สแต็ก MTP Android 11 จะวางสแต็ก MTP ไว้นอกขอบเขตของโมดูลทั้งหมด และตรวจสอบว่าสแต็กทำงานกับ API สาธารณะ

การทดสอบ

คุณตรวจสอบฟังก์ชันการทำงานของ MediaProvider ได้โดยใช้การทดสอบต่อไปนี้

  • หากต้องการยืนยันฟังก์ชันการทำงานของ API สาธารณะ MediaStore ให้ใช้การทดสอบใน CtsProviderTestCases แพ็กเกจของชุดเครื่องมือทดสอบความเข้ากันได้ (CTS) ของ Android

  • หากต้องการยืนยันฟังก์ชันการทำงานของส่วนประกอบภายในของ MediaProvider ให้ใช้การทดสอบใน MediaProviderTests

หากต้องการเรียกใช้การทดสอบทั้ง 2 ชุดพร้อมกัน ให้ใช้คำสั่ง atest ต่อไปนี้

atest --test-mapping packages/providers/MediaProvider