2025 年 3 月 27 日より、AOSP のビルドとコントリビューションには aosp-main
ではなく android-latest-release
を使用することをおすすめします。詳細については、AOSP の変更をご覧ください。
MediaProvider モジュール
コレクションでコンテンツを整理
必要に応じて、コンテンツの保存と分類を行います。
MediaProvider モジュールは、インデックスに登録されたメタデータ(SD カードと USB デバイスの音声、動画、画像)を最適化し、MediaStore 公開 API を介してそのデータをアプリで利用できるようにします。ユーザーのプライバシーを保護するため、MediaProvider モジュールは Android 10 で導入された対象範囲別ストレージ セキュリティ モデルを適用します。これには、機密性の高い位置情報メタデータの削除が含まれます。
このモジュールは更新可能です。これにより、Android でセキュリティの問題に迅速に対応し(機密性の高いユーザーデータの保護を実現)、新しいメディア形式をすばやく追加できます(ユーザーとデベロッパーの両方に対する一貫性を確保)。
Android 10 の変更点
Android 10 では、メディア ファイルからのデータの識別と抽出に関して、次のような改善が行われています。
ファイルの MIME タイプの最初の部分からファイル コンテンツ タイプを判別する。たとえば、OS は 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(上記以外の新しいメタデータ列で使用)。
PNG コンテナと WebP コンテナからメタデータを抽出するように ExifInterface
を改善しました。
画面キャプチャで DateTimeOriginal
メタデータを書き込むように SystemUI
を改善しました。
また、新しいメディア形式の追加、インデックス登録するストレージ デバイスの指定、MTP スタックの置き換えを行うことで、MediaProvider をカスタマイズできるようになりました。詳細については、カスタマイズをご覧ください。
モジュールの境界
Android 11 では、MTP 関連のロジックを除き、packages/providers/MediaProvider
内のすべてのコードが新しい場所に移行されます。さらに、frameworks/base/core/java/android/provider/MediaStore.java
が packages/providers/MediaProvider
のモジュール境界内になりました。
MediaProvider モジュールは APK-in-APEX 形式です。
依存関係
MediaProvider 依存関係はカスタマイズに関連しています(つまり、MediaProvider をカスタマイズする場合、実装がカスタマイズに関連する依存関係を満たしている必要があります)。
カスタムまたは非標準のメディア ファイル形式(ベンダー固有のカメラアプリによって生成された形式など)を使用する場合、各カスタム形式を MimeUtils
と Media Extractor モジュールに登録して、MediaProvider によるインデックス登録を有効にする必要があります。
StorageManagerService
の実装で使用されるストレージ デバイス(SD カードスロット、USB ポートなど)のカスタムセットを MediaProvider がインデックス登録できるようにするには、VolumeInfo.MOUNT_FLAG_INDEXABLE
フラグを設定します。
カスタム(AOSP 以外)の MTP 実装を使用する場合は、実装が公開 API とシステム API のみを使用して、MediaStore とやり取りできるようにする必要があります。
カスタマイズ
新しいメディア形式の追加、インデックス登録されるストレージ デバイスの制御、MTP スタックの置き換えができるようになりました。
カスタム メディア形式。新しいカスタム メディア形式ごとに、固有のファイル拡張子から MIME タイプへのマッピングを指定する必要があります。IANA の登録プロセスに従うことを強くおすすめします。
AOSP ですでに定義されている拡張機能または MIME タイプを再定義することはできません。
video/*
ファイルと audio/*
ファイルの場合、MediaProvider は引き続き MediaMetadataRetriever
を参照します。Android 10 Media Extractor を使用して、カスタム形式のメタデータを返します。
image/*
ファイルの場合、MediaProvider は引き続きメタデータの Exif
をベースとします。android.media.ExifInterface
を拡張することで、任意のカスタム イメージ形式の Exif
メタデータを抽出して返すことができます。
ストレージ デバイスのインデックス登録フラグ。MediaProvider は、StorageManager.getStorageVolumes()
によって返されたすべてのボリュームをインデックスに登録します。ここで、StorageVolume.getMediaStoreVolumeName()
は null ではない値です。返されるボリュームのリストをカスタマイズして、インデックス登録の対象を変えることができますが、一時的なボリューム(USB OTG ドライブなど)を含めることはおすすめしません。
MTP スタックの交換。Android 11 では MTP スタックを完全にモジュール境界外に配置し、公開 API に対して確実に機能するようにしています。
テスト
次のテストを使用して MediaProvider の機能を確認できます。
両方のテストセットをまとめて実行するには、次の atest
コマンドを使用します。
atest --test-mapping packages/providers/MediaProvider
このページのコンテンツやコードサンプルは、コンテンツ ライセンスに記載のライセンスに従います。Java および OpenJDK は Oracle および関連会社の商標または登録商標です。
最終更新日 2025-03-26 UTC。
[[["わかりやすい","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-03-26 UTC。"],[],[],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"]]