โมดูล 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 ใหม่เพื่อใช้ในการตรวจหาการเปลี่ยนแปลงที่เกิดขึ้นตั้งแต่จุดซิงค์ข้อมูลก่อนหน้าอย่างรวดเร็วและเชื่อถือได้

    • API สาธารณะใหม่ของ GROUP BY เพื่อใช้กับคอลัมน์ข้อมูลเมตาอื่นๆ ที่ไม่ได้กล่าวถึงข้างต้น

  • การปรับปรุง 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 ของ 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 Media Extractor เพื่อแสดงข้อมูลเมตาสำหรับรูปแบบที่กำหนดเอง

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

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

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

การทดสอบ

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

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

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

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

atest --test-mapping packages/providers/MediaProvider