自 2025 年 3 月 27 日起,我們建議您使用 android-latest-release
而非 aosp-main
建構及貢獻 AOSP。詳情請參閱「Android 開放原始碼計畫變更」。
MediaProvider 模組
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
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 的功能:
如要同時執行這兩組測試,請使用下列 atest
指令:
atest --test-mapping packages/providers/MediaProvider
這個頁面中的內容和程式碼範例均受《內容授權》中的授權所規範。Java 與 OpenJDK 是 Oracle 和/或其關係企業的商標或註冊商標。
上次更新時間:2025-07-27 (世界標準時間)。
[[["容易理解","easyToUnderstand","thumb-up"],["確實解決了我的問題","solvedMyProblem","thumb-up"],["其他","otherUp","thumb-up"]],[["缺少我需要的資訊","missingTheInformationINeed","thumb-down"],["過於複雜/步驟過多","tooComplicatedTooManySteps","thumb-down"],["過時","outOfDate","thumb-down"],["翻譯問題","translationIssue","thumb-down"],["示例/程式碼問題","samplesCodeIssue","thumb-down"],["其他","otherDown","thumb-down"]],["上次更新時間:2025-07-27 (世界標準時間)。"],[],[],null,["# MediaProvider module\n\nThe MediaProvider module optimizes indexed metadata (audio, video, and images\nfrom SD cards and USB devices) and makes that data available to apps through the\n[MediaStore public\nAPIs](https://developer.android.com/reference/android/provider/MediaStore).\nTo maintain user privacy, the MediaProvider module enforces the [scoped storage\nsecurity\nmodel](https://developer.android.com/training/data-storage/files/external-scoped)\nintroduced in Android 10, which includes redacting sensitive location metadata.\nThis module is updatable, enabling Android to respond faster to security issues\n(keeping sensitive user data protected) and add new media formats quicker\n(providing consistency to both users and developers).\n\nChanges in Android 10\n---------------------\n\nAndroid 10 introduced several improvements related to identifying and extracting\ndata from media files, specifically:\n\n- Determining the file content type using the first part of a file's MIME type.\n For example, the OS knows that both `image/png` and\n `image/x-newly-invented-format` are images, and can thus accurately describe\n relevant permissions to the end user.\n\n- Determining the MIME type using only the file extension (and without using\n [content sniffing](https://en.wikipedia.org/wiki/Content_sniffing)\n to avoid security issues).\n\n- Determining the MIME type of an arbitrary file using a combination of\n [upstream Debian Linux and Android\n mappings](https://android-review.googlesource.com/c/platform/libcore/+/735506).\n\n- Returning relevant data from `video/*` and `audio/*` files (via\n `MediaMetadataRetriever`) and `image/*` files (via `ExifInterface`).\n\nChanges in Android 11\n---------------------\n\nIn Android 11, the MediaProvider module builds on the\nchanges made in Android 10 with the following improvements:\n\n- Improvements to indexing. The MediaProvider module now indexes metadata by\n reconciling available metadata against MediaStore public APIs. Changes\n include:\n\n - New `is_favorite` column and `QUERY_ARG_MATCH_FAVORITE` argument to enable\n gallery-style apps to quickly filter media based on this column.\n\n - Indexing color space metadata.\n\n - New 'is_trashed' column and `QUERY_ARG_MATCH_TRASHED` argument to enable\n gallery-style apps to filter based on this column.\n\n - New APIs that enable bulk-modification of multiple items with a single user\n dialog prompt, including `createDeleteRequest()`, `createFavoriteRequest()`,\n `createTrashRequest()`, and `createWriteRequest()`.\n\n - New `GENERATION_ADDED` and `GENERATION_MODIFIED` columns for use in quickly\n and reliably detecting changes that have occurred since a previous\n synchronization point.\n\n - New `GROUP BY` public API for use with additional metadata columns not\n mentioned above.\n\n- Improvement to `ExifInterface` to extract metadata from PNG and WebP\n containers.\n\n- Improvements to `SystemUI` to write `DateTimeOriginal` metadata in screen\n captures.\n\nIn addition, you can now customize MediaProvider by adding new media formats,\nmarking which storage devices should be indexed, and even replacing the MTP\nstack. For details, see [Customization](#customization).\n\nModule boundary\n---------------\n\nAndroid 11 migrates all code in\n`packages/providers/MediaProvider` to a new location, with the notable exception\nof MTP-related logic. In addition,\n`frameworks/base/core/java/android/provider/MediaStore.java` is now *inside* the\nmodule boundary at `packages/providers/MediaProvider`.\n\nPackage format\n--------------\n\nThe MediaProvider module is in APK-in-APEX format.\n\nDependencies\n------------\n\nMediaProvider dependencies are related to [customizations](#customization) (that\nis, if you customize MediaProvider, you must ensure your implementation meets\nthe dependency associated with your customization).\n\n- When using custom or nonstandard media file formats (for example, a format\n generated by a vendor-specific Camera app), you must register each custom\n format with `MimeUtils` and the Media Extractor module to enable indexing by\n MediaProvider.\n\n- To ensure MediaProvider indexes a custom set of storage devices (such SD card\n slots and USB ports) used in a `StorageManagerService` implementation, set the\n `VolumeInfo.MOUNT_FLAG_INDEXABLE` flag.\n\n- When using a custom (non-AOSP) MTP implementation, ensure the implementation\n relies solely on public and system APIs to enable the implementation to\n interact with MediaStore.\n\nCustomization\n-------------\n\nYou can now add new media formats, influence which storage devices are indexed,\nand replace the MTP stack.\n\n- **Custom media formats.** For each new custom media format, you must provide a\n mapping from the unique file extension to a MIME type. We strongly encourage\n you to follow the [IANA registration\n process](https://www.iana.org/assignments/media-types/media-types.xhtml).\n\n - You can't redefine an extension or MIME type that's already defined in AOSP.\n\n - For `video/*` and `audio/*` files, MediaProvider continues consulting\n `MediaMetadataRetriever`. Use the Android 10 Media Extractors to return\n metadata for custom formats.\n\n - For `image/*` files, MediaProvider continues standardizing on `Exif` for\n metadata. You can extend `android.media.ExifInterface` to extract and return\n `Exif` metadata for any custom image formats.\n\n- **Storage devices indexing flag.** MediaProvider indexes all volumes returned\n by `StorageManager.getStorageVolumes()` where\n `StorageVolume.getMediaStoreVolumeName()` is non-null. You can customize the\n list of volumes returned to influence what is indexed, but we advise against\n including transient volumes (such as USB OTG drives).\n\n- **MTP stack replacement.** Android 11 places the MTP\n stack entirely outside the module boundary and ensures that it works against\n public APIs.\n\nTesting\n-------\n\nYou can verify the functionality of MediaProvider using the following tests:\n\n- To verify the functionality of MediaStore public APIs, use tests in the\n `CtsProviderTestCases` package of the Android Compatibility Test Suite (CTS).\n\n- To verify the functionality of MediaProvider internals, use tests in\n `MediaProviderTests`.\n\nTo run both sets of tests together, use the following `atest` command: \n\n atest --test-mapping packages/providers/MediaProvider"]]