MediaProvider 模組最佳化索引元資料(SD 卡和 USB 裝置中的音訊、視訊和影像),並透過MediaStore 公共 API將這些資料提供給應用程式。為了維護使用者隱私,MediaProvider 模組強制執行 Android 10 中引入的範圍儲存安全模型,其中包括編輯敏感位置元資料。該模組是可更新的,使 Android 能夠更快地響應安全性問題(保護敏感用戶資料)並更快地添加新媒體格式(為用戶和開發人員提供一致性)。
Android 10 的變化
Android 10 引入了多項與從媒體檔案中識別和提取資料相關的改進,具體來說:
使用檔案 MIME 類型的第一部分來確定文件內容類型。例如,作業系統知道
image/png
和image/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_ADDED
和GENERATION_MODIFIED
欄位用於快速可靠地檢測自上一個同步點以來發生的變更。新的
GROUP BY
公共 API,可與上面未提及的其他元資料列一起使用。
改進
ExifInterface
以從 PNG 和 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