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

    • 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

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

    • สำหรับไฟล์ 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