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
標準化為 metadata。您可以擴充android.media.ExifInterface
,針對任何自訂圖片格式擷取並傳回Exif
中繼資料。
儲存裝置索引標記。MediaProvider 會為
StorageVolume.getMediaStoreVolumeName()
非空值時,由StorageManager.getStorageVolumes()
傳回的所有音量建立索引。您可以自訂傳回的磁碟區清單,以影響索引的內容,但我們建議不要納入暫時性磁碟區 (例如 USB OTG 磁碟機)。MTP 堆疊取代。Android 11 將 MTP 堆疊完全置於模組邊界之外,並確保其可與公開 API 搭配運作。
測試
您可以使用下列測試驗證 MediaProvider 的功能:
如要驗證 MediaStore 公用 API 的功能,請使用 Android Compatibility Test Suite (CTS) 的
CtsProviderTestCases
套件中的測試。如要驗證 MediaProvider 內部功能,請使用
MediaProviderTests
中的測試。
如要同時執行這兩組測試,請使用下列 atest
指令:
atest --test-mapping packages/providers/MediaProvider