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
和 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