โมดูล MediaProvider

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

    • คอลัมน์ is_favorite ใหม่และอาร์กิวเมนต์ QUERY_ARG_MATCH_FAVORITE เพื่อเปิดใช้ แอปแบบแกลเลอรีรูปภาพเพื่อกรองสื่ออย่างรวดเร็วโดยอิงตามคอลัมน์นี้

    • การจัดทำดัชนีข้อมูลเมตาของพื้นที่สี

    • "is_trashes" ใหม่ และอาร์กิวเมนต์ 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