MediaProvider 模組

MediaProvider 模組會最佳化已建立索引的中繼資料 (音訊、影片和圖片 從 SD 卡和 USB 裝置存取資料),並透過 MediaStore 公開 API 為了維護使用者隱私,MediaProvider 模組會強制執行限定範圍儲存空間。 安全性 模型 其中包含遮蓋敏感位置中繼資料。 這個模組可更新,讓 Android 更快回應安全性問題 (確保使用者機密資料受到保護),並更快加入新的媒體格式 讓使用者和開發人員保持一致。

Android 10 的異動

Android 10 推出了幾項辨識及擷取功能 來自媒體檔案的資料,具體來說是:

  • 使用檔案 MIME 類型的第一個部分決定檔案類型。 舉例來說,OS 知道 image/pngimage/x-newly-invented-format 是圖片,因此能準確描述 授予使用者相關權限

  • 僅使用副檔名 (且不使用 偵測內容 ,避免發生安全性問題)。

  • 使用 上游 Debian Linux 和 Android 對應

  • 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,可從 PNG 和 WebP 擷取中繼資料 容器

  • 改善 SystemUI,以便將 DateTimeOriginal 中繼資料寫入畫面中 擷取。

此外,您現在可以新增媒體格式,自訂 MediaProvider。 標示應為哪些儲存裝置建立索引,甚至取代 MTP 詳情請參閱「自訂」。

模組邊界

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 會為自訂儲存裝置 (例如 SD 卡) 建立索引 建立在 StorageManagerService 實作中使用的運算單元和 USB 連接埠),請將 VolumeInfo.MOUNT_FLAG_INDEXABLE 標記。

  • 使用自訂 (非 Android 開放原始碼計畫) MTP 實作時,請務必完成導入程序 完全仰賴公用和系統 API 來執行 就會與 MediaStore 互動

自訂

您現在可以新增媒體格式,決定哪些儲存裝置已編入索引 並取代 MTP 堆疊

  • 自訂媒體格式。針對每個新的自訂媒體格式,您必須提供 將專屬副檔名對應至 MIME 類型。強烈建議你 必須遵守 IANA 註冊編號 程序

    • 您無法重新定義已在 Android 開放原始碼計畫中定義的擴充功能或 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 Compatibility Test Suite (CTS) 的 CtsProviderTestCases 套件。

  • 如要驗證 MediaProvider 內部功能的功能,請在 MediaProviderTests

如要同時執行這兩組測試,請使用下列 atest 指令:

atest --test-mapping packages/providers/MediaProvider