媒體提供者模塊

該MediaProvider模塊優化索引的元數據(音頻,視頻和圖片從SD卡和USB設備),使通過的適用於應用程序的數據MediaStore公共API 。為了維持用戶隱私,MediaProvider模塊能夠強制作用域存儲安全模型中的Android 10,其包括redacting敏感位置元數據引入。該模塊是可更新的,使 Android 能夠更快地響應安全問題(保護敏感的用戶數據)並更快地添加新媒體格式(為用戶和開發人員提供一致性)。

Android 10 中的變化

Android 10 引入了多項與從媒體文件中識別和提取數據相關的改進,具體而言:

  • 使用文件 MIME 類型的第一部分確定文件內容類型。例如,OS知道這兩個image/pngimage/x-newly-invented-format是圖像,並且因此可以準確地描述相關權限給最終用戶。

  • 確定僅使用文件擴展名的MIME類型(而無需使用內容嗅探,以避免安全問題)。

  • 確定所述MIME類型使用的組合的任意文件的上游的Debian的Linux和Android映射

  • 從返回相關數據video/*audio/*文件(通過MediaMetadataRetriever )和image/*文件(通過ExifInterface )。

Android 11 中的變化

在 Android 11 中,MediaProvider 模塊在 Android 10 中所做的更改的基礎上進行了以下改進:

  • 索引的改進。 MediaProvider 模塊現在通過根據 MediaStore 公共 API 協調可用元數據來索引元數據。變化包括:

    • is_favorite柱和QUERY_ARG_MATCH_FAVORITE參數,允許廊式的應用程序基於此列快速過濾介質。

    • 索引色彩空間元數據。

    • 新“is_trashed”列和QUERY_ARG_MATCH_TRASHED參數,允許基於此列廊式應用程序進行篩選。

    • 新的API,使多個項目的批量修改與單個用戶對話提示,包括createDeleteRequest() createFavoriteRequest() createTrashRequest()createWriteRequest()

    • GENERATION_ADDEDGENERATION_MODIFIED列在快速和可靠地檢測,因為先前的同步點所出現的變化使用。

    • GROUP BY與上面未提及的其他元數據列使用公共API。

  • 改進ExifInterface從PNG和WebP的容器中提取元數據。

  • 改進SystemUIDateTimeOriginal在屏幕捕獲的元數據。

此外,您現在可以通過添加新媒體格式、標記應索引哪些存儲設備,甚至替換 MTP 堆棧來自定義 MediaProvider。有關詳細信息,請參閱定制

模塊邊界

Android的11遷移中的所有代碼packages/providers/MediaProvider到新的位置,與MTP相關的邏輯是明顯的例外。此外, frameworks/base/core/java/android/provider/MediaStore.java現在是模塊邊界packages/providers/MediaProvider

包裝形式

MediaProvider 模塊採用 APK-in-APEX 格式。

依賴關係

MediaProvider依賴性與自定義(即,如果您自定義MediaProvider,你必須確保你的實現與滿足您的自定義相關的依賴)。

  • 當使用自定義或非標準的媒體文件格式(例如,由供應商特定的相機應用程序生成的格式),你必須註冊到每個自定義格式MimeUtils和媒體提取器模塊通過MediaProvider啟用索引功能。

  • 為了確保MediaProvider指標在使用存儲設備(如SD卡插槽和USB端口)的一組自定義StorageManagerService執行,設置VolumeInfo.MOUNT_FLAG_INDEXABLE標誌。

  • 使用自定義(非 AOSP)MTP 實現時,請確保該實現僅依賴公共和系統 API,以使該實現能夠與 MediaStore 交互。

定制

您現在可以添加新的媒體格式、影響索引的存儲設備以及替換 MTP 堆棧。

  • 自定義媒體格式。對於每種新的自定義媒體格式,您必須提供從唯一文件擴展名到 MIME 類型的映射。我們強烈建議您遵循IANA註冊過程

    • 您不能重新定義已在 AOSP 中定義的擴展名或 MIME 類型。

    • 對於video/*audio/*文件,MediaProvider繼續諮詢MediaMetadataRetriever 。使用 Android 10 Media Extractors 返回自定義格式的元數據。

    • 對於image/*文件,MediaProvider繼續規範上Exif元數據。您可以擴展android.media.ExifInterface提取和返回Exif元數據的任何自定義圖像格式。

  • 存儲設備索引標誌。 MediaProvider指標通過返回的所有卷StorageManager.getStorageVolumes()其中StorageVolume.getMediaStoreVolumeName()不為null。您可以自定義返回的捲列表以影響索引的內容,但我們建議不要包含臨時卷(例如 USB OTG 驅動器)。

  • MTP 堆棧替換。 Android 11 將 MTP 堆棧完全置於模塊邊界之外,並確保它適用於公共 API。

測試

您可以使用以下測試驗證 MediaProvider 的功能:

  • 為了驗證MediaStore公共API,使用測試的功能在CtsProviderTestCases了Android兼容性測試套件(CTS)的包裝。

  • 為了驗證MediaProvider內部的功能,使用測試MediaProviderTests

要運行兩組測試一起,使用下面的atest命令:

atest --test-mapping packages/providers/MediaProvider