โมดูล 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-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