โมดูล MediaProvider

โมดูล MediaProvider จะเพิ่มประสิทธิภาพข้อมูลเมตาที่จัดทําดัชนี (เสียง วิดีโอ และรูปภาพจากการ์ด SD และอุปกรณ์ USB) และทําให้แอปเข้าถึงข้อมูลดังกล่าวได้ผ่าน MediaStore public API โมดูล 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 จะจัดทำดัชนีข้อมูลเมตาโดยทำการปรับยอดข้อมูลเมตาที่มีอยู่กับ MediaStore Public API การเปลี่ยนแปลงดังกล่าวได้แก่

    • คอลัมน์ 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

ทรัพยากร Dependency

Dependency ของ MediaProvider เกี่ยวข้องกับการปรับแต่ง (กล่าวคือ หากคุณปรับแต่ง MediaProvider คุณต้องตรวจสอบว่าการติดตั้งใช้งานเป็นไปตาม Dependency ที่เชื่อมโยงกับการปรับแต่งของคุณ)

  • เมื่อใช้รูปแบบไฟล์สื่อที่กำหนดเองหรือไม่เป็นมาตรฐาน (เช่น รูปแบบที่สร้างขึ้นโดยแอปกล้องเฉพาะของผู้ให้บริการ) คุณต้องลงทะเบียนรูปแบบที่กำหนดเองแต่ละรูปแบบกับ MimeUtils และข้อบังคับของ Media Extractor เพื่อเปิดใช้การจัดทําดัชนีโดย MediaProvider

  • ตั้งค่า Flag VolumeInfo.MOUNT_FLAG_INDEXABLE เพื่อให้ MediaProvider จัดทําดัชนีชุดอุปกรณ์เก็บข้อมูลที่กําหนดเอง (เช่น ช่องการ์ด SD และพอร์ต USB) ที่ใช้กับการติดตั้งใช้งาน StorageManagerService

  • เมื่อใช้การติดตั้งใช้งาน MTP ที่กําหนดเอง (ไม่ใช่ AOSP) ให้ตรวจสอบว่าการติดตั้งใช้งานใช้ API สาธารณะและ API ของระบบเพียงอย่างเดียวเพื่อให้การติดตั้งใช้งานโต้ตอบกับ MediaStore ได้

การปรับแต่ง

ตอนนี้คุณสามารถเพิ่มรูปแบบสื่อใหม่ กำหนดอุปกรณ์เก็บข้อมูลที่จะให้จัดทําดัชนี และแทนที่กอง MTP ได้แล้ว

  • รูปแบบสื่อที่กำหนดเอง สำหรับรูปแบบสื่อที่กำหนดเองใหม่แต่ละรูปแบบ คุณต้องระบุการแมปจากนามสกุลไฟล์ที่ไม่ซ้ำกันกับประเภท MIME เราขอแนะนําอย่างยิ่งให้คุณทําตามกระบวนการจดทะเบียน IANA

    • คุณไม่สามารถกำหนดนามสกุลหรือประเภท MIME ซ้ำซึ่งกำหนดไว้ใน AOSP อยู่แล้ว

    • สำหรับไฟล์ video/* และ audio/* ทาง MediaProvider จะยังคงให้คำปรึกษาต่อไป MediaMetadataRetriever ใช้เครื่องมือแยกสื่อของ Android 10 เพื่อแสดงข้อมูลเมตาสำหรับรูปแบบที่กำหนดเอง

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

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

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

การทดสอบ

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

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

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

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

atest --test-mapping packages/providers/MediaProvider