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_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.javapackages/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 の機能を確認できます。

  • MediaStore 公開 API の機能を確認するには、Android 互換性テストスイート(CTS)の CtsProviderTestCases パッケージのテストを使用します。

  • MediaProvider の内部の機能を確認するには、MediaProviderTests でテストを使用します。

両方のテストセットをまとめて実行するには、次の atest コマンドを使用します。

atest --test-mapping packages/providers/MediaProvider