媒體提供模組

MediaProvider 模組最佳化索引元資料(SD 卡和 USB 裝置中的音訊、視訊和影像),並透過MediaStore 公共 API將這些資料提供給應用程式。為了維護使用者隱私,MediaProvider 模組強制執行 Android 10 中引入的範圍儲存安全模型,其中包括編輯敏感位置元資料。該模組是可更新的,使 Android 能夠更快地響應安全性問題(保護敏感用戶資料)並更快地添加新媒體格式(為用戶和開發人員提供一致性)。

Android 10 的變化

Android 10 引入了多項與從媒體檔案中識別和提取資料相關的改進,具體來說:

  • 使用檔案 MIME 類型的第一部分來確定文件內容類型。例如,作業系統知道image/pngimage/x-newly-invented-format都是映像,因此可以準確地向最終使用者描述相關權限。

  • 僅使用檔案副檔名確定 MIME 類型(不使用內容嗅探以避免安全問題)。

  • 使用上游 Debian Linux 和 Android 映射的組合來確定任意檔案的 MIME 類型。

  • 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以從 PN​​G 和 WebP 容器中提取元資料。

  • 改進了SystemUI ,以在螢幕擷取中寫入DateTimeOriginal元資料。

此外,您現在可以透過新增媒體格式、標記應索引哪些儲存設備,甚至取代 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 索引StorageManagerService實作中使用的一組自訂儲存設備(例如 SD 卡插槽和 USB 連接埠),請設定VolumeInfo.MOUNT_FLAG_INDEXABLE標誌。

  • 使用自訂(非 AOSP)MTP 實作時,請確保實作僅依賴公共和系統 API 來實現與 MediaStore 互動。

客製化

現在您可以新增新的媒體格式、影響對哪些儲存裝置進行索引以及取代 MTP 堆疊。

  • 自訂媒體格式。對於每個新的自訂媒體格式,您必須提供從唯一檔案副檔名到 MIME 類型的對應。我們強烈建議您遵循IANA 註冊流程

    • 您無法重新定義 AOSP 中已定義的副檔名或 MIME 類型。

    • 對於video/*audio/*文件,MediaProvider 繼續諮詢MediaMetadataRetriever 。使用 Android 10 媒體擷取器傳回自訂格式的元資料。

    • 對於image/*文件,MediaProvider 繼續將元資料的Exif標準化。您可以擴展android.media.ExifInterface以提取並傳回任何自訂影像格式的Exif元資料。

  • 儲存設備索引標誌。 MediaProvider 對StorageManager.getStorageVolumes()傳回的所有磁碟區進行索引,其中StorageVolume.getMediaStoreVolumeName()為非空。您可以自訂傳回的磁碟區清單以影響索引的內容,但我們建議不要包含臨時磁碟區(例如 USB OTG 磁碟機)。

  • MTP 堆疊替換。 Android 11 將 MTP 堆疊完全放置在模組邊界之外,並確保它可以針對公共 API 運行。

測試

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

  • 若要驗證 MediaStore 公共 API 的功能,請使用 Android 相容性測試套件 (CTS) 的CtsProviderTestCases套件中的測試。

  • 若要驗證 MediaProvider 內部功能,請使用MediaProviderTests中的測試。

若要同時執行兩組測試,請使用以下atest指令:

atest --test-mapping packages/providers/MediaProvider