媒體提供者模塊

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和 Media Extractor 模塊註冊每種自定義格式,以啟用 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