MediaProvider 模組

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

Android 10 的異動

Android 10 針對在媒體檔案識別及擷取資料方面做出了幾項改善,具體來說:

  • 使用檔案 MIME 類型的第一個部分決定檔案類型。舉例來說,OS 知道 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,以便從 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 標記。

  • 使用自訂 (非 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