AndroidにおけるMediaProviderとは何か、どのように機能するのか、そしてなぜ重要なのか。

  • MediaProviderは、Androidモジュールの一つで、MediaStoreを通じて写真、動画、音声をインデックス化してアプリに公開することで、パフォーマンスと整理性を向上させます。
  • これはメインラインモジュールの一部であるため、新しいフォーマットとの互換性を追加したり、セキュリティ上の欠陥を修正したりするために、Google Playからアップデートされます。
  • スコープ付きストレージの適用、アクセス権限の制御、写真の位置情報などの機密性の高いメタデータの非表示などにより、プライバシーを強化します。
  • OEMや開発者は、サポートするフォーマットやインデックス化するボリュームをカスタマイズしたり、互換性のあるビデオトランスコーディングなどの高度な機能を利用したりできます。

メディアプロバイダー Android マルチメディアストレージ

近年、Androidはファイル管理とシステムセキュリティにおいて劇的な進化を遂げてきました。その中でも、適切なストレージとユーザーのプライバシー保護に不可欠でありながら、あまり説明されていない要素の一つが、よく知られているMediaProviderモジュールです。このコンポーネントが何なのか、なぜシステムメッセージに表示されることがあるのか​​、Androidのバージョンアップごとにどのような改善が加えられているのか、そしてスマートフォンにどのような影響を与えるのか疑問に思ったことがある方は、ぜひこの記事で詳しく解説してください。

スマートフォンの設定画面を操作したり、ストレージ使用量を確認したり、技術フォーラムを閲覧したりしていると、「MediaProvider」という名前を目にする機会は多いでしょう。しかし、ほとんどの人は、それが何をするものなのか、また、フォトギャラリー、音楽プレーヤー、ファイルマネージャーなどのアプリがスムーズに動作するためになぜ不可欠なのかを完全に理解していません。ここでは、スマートフォンの理解を深めたい方、カスタムアプリやROMを開発したい方など、日々のAndroid体験におけるMediaProviderの役割を詳しく見ていきましょう。

MediaProvider とは何ですか? Android での機能は何ですか?

Android MediaProviderモジュールとは何ですか?

El メディアプロバイダーモジュール これは、Android システムの内部コンポーネントの 1 つで、 マルチメディアファイルの管理、インデックス作成、およびアクセス提供 写真、ビデオ、音楽など、内部メモリと外部デバイス(SDカード、USBドライブなど)の両方に保存されているもの。これは通常のアプリではなく、 システムコンテンツプロバイダー これは公開データベースに依存している MediaStore これにより、他のアプリがマルチメディアコンテンツに迅速かつ安全にアクセスできるようになります。

その主な機能は、ファイルを分析し、メタデータを抽出し、最適化されたテーブルにインデックス化することです。このメタデータには、ファイルの種類、ビデオまたはオーディオの再生時間、画像解像度、撮影日、サイズ、保存場所、そして場合によっては写真の高度なEXIFデータなどの要素が含まれます。

このモジュールのおかげで、アプリはフォルダツリー全体を手動でスキャンすることなく、ライブラリ全体を表示できます。たとえば、フォトギャラリーはすべてのディレクトリをスキャンする必要はありません。MediaStoreにクエリを送信し、数ミリ秒でページ分割されたすべての画像のリストを取得し、必要に応じてソートおよびフィルタリングします。これにより、ファイルシステムを直接スキャンする場合と比較して、パフォーマンスとバッテリー寿命が大幅に向上します。

MediaProviderは、スコープ付きストレージモデルとも統合されています。実際には、このモジュールはセキュリティルールを適用して、どのアプリが特定のファイルを表示および変更できるかを制御します。たとえば、アプリがその情報を必要としない場合や、必要な権限を持っていない場合、写真が撮影された正確な場所などの機密性の高いメタデータを非表示または編集します。

もう一つの重要な点は、MediaProviderがいわゆるメインラインモジュール(またはシステム更新可能モジュール)の一部であることです。これにより、GoogleとメーカーはGoogle Playを通じて独自にアップデートを行うことができます。こうすることで、システム全体のアップデートを待つことなく、セキュリティ上の脆弱性の修正、新しいファイル形式との互換性の追加、機能の改良などが可能になります。

MediaProviderがあなたの日常生活に及ぼす影響

日常的に使用されるメディアプロバイダー

目には見えませんが、MediaProviderは常にバックグラウンドで動作しています。それが日々のユーザー体験にどのように影響するかを示す明確な例をいくつか挙げます。

  • ギャラリーのクイックオープニング: 写真アプリを開くと、MediaStoreに問い合わせが行われ、モジュールによる事前のインデックス作成のおかげで、画像をほぼ瞬時に表示できます。
  • 日付、種類、アルバムによる検索: 多くのギャラリーでは、動画、自撮り写真、スクリーンショット、特定の日付でフィルタリングできます。これらの情報はすべて メディアプロバイダーによって管理されるメタデータ.
  • 音楽プレーヤーとポッドキャストプレーヤー: アーティスト別、アルバム別、ジャンル別、またはプレイリスト別のリストは、MediaProviderがオーディオファイルから収集し、正規化したデータに基づいています。
  • メッセージングおよびソーシャル メディア アプリ: WhatsApp、Telegram、またはInstagramから画像セレクターを使用して写真を共有すると、実際には MediaStoreカタログを読む さらに、リクエストされたコンテンツの種類でフィルタリングすることも可能です。
  • ファイルマネージャー: 一部のブラウザは、何千ものフォルダやファイルを手動で閲覧する代わりに、MediaStoreクエリを使用してすべてのマルチメディアをすばやく一覧表示します。

カメラで撮影した写真が数秒以内にギャラリーやクラウドに表示されるといった、目に見えにくいタスクも、通常はMediaProviderと連携して行われます。MediaProviderは、新しいアイテムの登録、メタデータの抽出、および変更内容を関係するアプリケーションへの通知を担当します。

MediaProvider の進化: Android 10 から Android 11 へ、そしてそれ以降

メディアプロバイダーのアップデート

MediaProviderの進化における大きな飛躍は、 Android 10でスコープ付きストレージが導入されたことから始まりました。それ以降、システムはメディアファイルの識別方法とアプリへの公開方法を再編成し、MediaProviderはよりスマートで安全なものへと進化する必要に迫られました。

Android 10以降に導入された変更点

そのバージョン以降、Androidはマルチメディアファイルからのデータの識別と抽出に関して、いくつかの重要な改善を導入しました。

  • システムは MIMEタイプの前半部分を使用したファイルコンテンツタイプ例えば、彼は次のことを知っている。 image/png y image/x-newly-invented-format 両方とも 画像の種類これにより、ユーザーの権限とそれに関連する動作をより詳細に説明できるようになります。
  • セキュリティを向上させるために、 拡張子からのみMIMEタイプを推測する ファイルから情報を取得し、脆弱性を生じさせる可能性のあるコンテンツ検出技術を回避する。
  • MIMEの決定は、 Debian Linuxから継承したテーブルとAndroid独自の定義を組み合わせたものこれにより、異常なフォーマットの検出がより確実かつ一貫して行われるようになります。
  • MediaProviderは、高度なメタデータの取得を専門ツールに委任します。 MediaMetadataRetriever ファイル用 video/* y audio/*、そして、 ExifInterface ファイル用 image/*、こうして得られる 期間、ビットレート、解像度、向き、カメラ情報 その他役立つ情報も掲載しております。

これらの変更により、アプリはより信頼性が高く標準化されたメタデータを受け取ることが可能になり、同時にセキュリティ対策が強化され、今日私たちが知っている洗練されたアクセス権限の基盤が築かれました。

Android 11以降に導入された改善点

Android 11では、MediaProviderはこれらの基盤の上にさらに発展させ、アプリのコンテンツ構成、パフォーマンス、機能においてさらなる一歩を踏み出しました。

  • 作られました インデックス作成における大幅な改善 ファイルとメタデータについて。このモジュールは、利用可能なメタデータをMediaStore APIが公開する情報と照合し、内部に保存されている情報とアプリケーションがクエリできる情報をより適切に整合させます。
  • データベースに新しい列が追加されました。 is_favorite そして協議の必要性についての議論 QUERY_ARG_MATCH_FAVORITEこれにより、ギャラリータイプのアプリケーションが可能になります。 お気に入りとしてマークされたコンテンツをすばやくフィルタリングします ユーザーによる。
  • メディアプロバイダーは インデックスカラースペースメタデータHDRコンテンツの処理、より実物に近い写真、そして高度なディスプレイでのより正確な表示を実現する上で不可欠です。
  • そのコラムは導入されました is_trashed と議論 QUERY_ARG_MATCH_TRASHED ファイルの区別を明確にするために ごみ箱ギャラリーがそのゴミ箱をネイティブに管理できるようにする。
  • 彼らは現れた 一括操作のための新しいAPI 単一のユーザー確認ダイアログを持つ複数の要素について、以下を含む。
    • createDeleteRequest() 複数のファイルを一度に削除する。
    • createFavoriteRequest() 複数のお気に入りを一度の操作で登録または登録解除する。
    • createTrashRequest() 複数のファイルをまとめて直接ゴミ箱に送信する。
    • createWriteRequest() 複数の項目について書き込み許可を申請する。
  • 新しい列が追加されました。 GENERATION_ADDED y GENERATION_MODIFIED アプリを許可する 前回の同期以降に変更された内容を迅速に検出します。 ライブラリ全体を再スキャンする必要なく。
  • 1つ追加されました 公開API GROUP BY これにより、アプリ内で複雑な後処理を行うことなく、アルバム、日付、その他のメタデータに基づいて検索結果をグループ化できます。
  • 改善されました ExifInterface パラ PNGおよびWebPコンテナからメタデータを抽出する高度な処理が可能な画像フォーマットの数を拡大する。
  • SystemUIがメタデータの書き込みを開始しました DateTimeOriginal スクリーンショットでは、MediaProvider が これらの種類の画像をより適切に整理して表示するために ギャラリー内部。

アーキテクチャ面では、MediaProviderはAPK-in-APEX形式に移行されました。これは、JavaコードがシステムレベルのAPEXコンテナ内にAPKとしてパッケージ化されることを意味します。この方式の利点は、モジュールをフレームワークの多くの部分よりも早い段階でブートプロセスにロードできるだけでなく、Google Play経由での迅速なアップデートも可能になることです。

MediaProvider と Mainline モジュール: Android でのスタンドアロン アップデート

Androidのメインラインモジュール

Googleが断片化に対抗し、より安全なデバイスを提供するための主要戦略の一つとして、メインラインモジュールの開発が挙げられます。これらは、Google Playとは独立してアップデートできるシステムコンポーネントであり、メーカーの直接的な介入や完全なOTAアップデートのインストールを必要としません。

これらのモジュールには、MediaProviderのほか、ART(アプリ実行環境)、Conscrypt(暗号化ライブラリ)、Media、Media Codecs、Wi-Fi、Tetheringなど、多数のモジュールが含まれています。これらのモジュールが連携することで、Androidは各メーカーのリリーススケジュールに完全に依存することなく、重大なバグの修正、パフォーマンスの向上、機能の追加が可能になります。

モジュール型アーキテクチャはAndroid 10から導入され始めましたが、特にMediaProviderはAndroid 11以降のメインラインアップデートの恩恵を受けています。これにより、セキュリティ上の脆弱性、新しいマルチメディアフォーマットとの非互換性、インデックス作成パフォーマンスの問題が検出された場合でも、 Googleは他のGoogle Playアプリと同様にパッチを適用してアップデートを配信できます。このようにして、たとえメーカーが新しいAndroidバージョンを迅速にリリースしない場合でも、お使いのスマートフォンはより安全で、エコシステム全体との一貫性を保つことができます。

他にどのようなメインライン モジュールがありますか? MediaProvider はそれらとどのように関係していますか?

MediaProviderに関連する主要モジュール

MediaProviderは、システムのモジュール性、セキュリティ、およびアップグレードの容易性を向上させるために設計された、数多くのMainlineモジュールのうちの1つです。特にマルチメディアとネットワークエクスペリエンスに関連する重要なモジュールには、以下のようなものがあります。

  • メディア: 再生、キャプチャ、ストリーム管理サービスなど、モバイルデバイス上でのマルチメディアファイルの処理を担います。
  • メディアコーデック: オーディオおよびビデオコーデックを常に最新の状態に保つことで、システム全体に手を加えることなく、デコードとエンコードにおける互換性とセキュリティを向上させることができます。
  • アート: アプリの実行環境(コンパイル、バイトコード最適化など)を管理します。このモジュールの改善は、 アプリケーションパフォーマンス.
  • コンスクリプト: これは、安全な接続、証明書、暗号化に不可欠な、システムの暗号化部分を更新するものです。
  • Wi-Fiを: Wi-Fi接続ロジックが含まれており、 安定性、互換性、セキュリティの向上 完全なOTA配信なしで。
  • テザリング: モバイルデバイスを介して、Wi-Fi、USB、Bluetooth、またはイーサネット接続の共有を制御できます。
  • パーミッションコントローラー: ユーザーの権限とプライバシーに関するインターフェース要素を管理するモジュールを更新してください。

MediaProviderは、 MediaモジュールおよびMedia Codecsモジュールと密接に連携して動作します。これらのモジュールは、MediaProviderがインデックス化するコンテンツのデコードと処理を担当します。新しいフォーマットがリリースされたり、既存のコーデックが更新されたりすると、他のメディアモジュールも更新されていれば、MediaProviderはAndroid全体のアップデートを必要とせずに、これらの新しいフォーマット(例えば、新しいHEVCバリアント、HDR、オーディオコーデックなど)を認識してカタログ化することができます。

お使いのスマートフォンがどのMainlineモジュールをサポートしているかを確認するには、無料アプリのMainline Updaterなどのツールを使用できます。このアプリは、どのモジュールが存在するかを表示し、ボタンを1つ押すだけでGoogle Playのシステムアップデートセクションに移動します。そこで、MediaProviderなどに影響を与える保留中のパッチがあるかどうかを確認できます。

メディアプロバイダー、プライバシー、ストレージのセキュリティ

プライバシーとメディアプロバイダー

MediaProviderに関連する最近の最大の進歩の1つは、ユーザーのプライバシー保護です。以前は、多くのアプリが外部ストレージ上のフォルダ全体にアクセスし、システムによる微調整なしに、写真に埋め込まれたGPS位置情報などの非常に詳細なメタデータを読み取ることができました。

スコープ付きストレージ、MediaProvider、MediaStoreの組み合わせにより、状況は変化しました。

  • アプリには アクセス制限あり 写真、ビデオ、オーディオに。たとえば、写真編集アプリは、ユーザーが選択した特定の画像にアクセスできます。 写真ピッカーしかし、ギャラリーの残りの部分はそうではありません。
  • メディアプロバイダーは 機密メタデータを編集または制限するアプリがそのデータを必要としない場合、キャプチャの正確な位置や内部カメラ情報などのデータは削除されます。
  • 許可証はますます 粒状で透明もはやストレージへの完全なアクセスを許可または拒否するのではなく、アクセスを許可するということです。 特定の種類のコンテンツ (画像、動画、音声)あるいはユーザーが選択したファイル。
  • プライベートな文書や機密コンテンツをストレージからスキャンしようとする悪意のあるアプリに対する保護が強化されます。MediaProvider は、 フィルターと審判 目に見えるもの、あるいは変更可能なもの。

これらすべては、最新のフォトピッカーやクラウドベースのメディアコンテンツプロバイダーといった高度なエクスペリエンスの可能性と組み合わされており、MediaProviderもデータフローの一部となっています。

APIと使用例: アプリがMediaProviderとやり取りする方法

MediaProviderを使用するアプリ

ユーザーアプリケーションはMediaProviderと直接通信するのではなく、インターフェースとして機能する公開APIであるMediaStoreを介して通信します。このAPIは、メディアファイルに標準化された方法でアクセスするためのインテント、定数、クエリメソッドなど、包括的なエコシステムを提供します。

コンテンツの取得と選択の試み

MediaStore(ひいてはMediaProvider)を活用する最も代表的なインテントには、以下のようなものがあります。

  • MediaStore.ACTION_IMAGE_CAPTURE: これにより、カメラを起動して画像を撮影し、通話アプリに返すことができます。
  • MediaStore.ACTION_IMAGE_CAPTURE_SECURE: 前述のものと似ていますが、デバイスが保護されている環境(PIN、パターン、生体認証など)で、安全なコンテキストが維持されるように設計されています。
  • MediaStore.ACTION_VIDEO_CAPTURE: カメラをビデオモードで起動し、その結果を呼び出し元のアプリケーションに返します。
  • MediaStore.ACTION_PICK_IMAGES: 開く 写真ピッカー 最新のAndroidは、さまざまなソース(ローカルストレージ、クラウドなど)から画像や動画を選択するための統一されたエクスペリエンスを提供します。
  • MediaStore.ACTION_PICK_IMAGES_SETTINGS: これにより、写真選択ツールとメディアプロバイダーに関する設定画面が表示されます。
  • MediaStore.ACTION_REVIEW y MediaStore.ACTION_REVIEW_SECURE: これらを使用すると、新たに撮影したマルチメディアコンテンツを、管理された環境で確認またはプレビューできます。

これらのインテントに加えて、MediaStoreはMediaProviderが尊重し、特定のルールを適用するために使用する多数の追加機能と定数を定義しています。いくつかの例を挙げます。

  • EXTRA_DURATION_LIMIT: 動画撮影時に許可される最大録画時間。
  • EXTRA_SIZE_LIMIT: 最大出力ファイルサイズ。
  • EXTRA_OUTPUT: 生成された画像または動画が保存されるURI。
  • EXTRA_PICK_IMAGES_MAX: セレクターセッションでユーザーが選択できるアイテムの最大数。

MediaStoreへの高度なクエリ

メディアライブラリを読み込む必要があるアプリは、さまざまな引数とフィルタを使用してMediaStoreにクエリを実行します。MediaProviderがMediaStoreを介して公開する機能には、次のようなものがあります。

  • お気に入りとゴミ箱でフィルタリング: 引数を使用する QUERY_ARG_MATCH_FAVORITE y QUERY_ARG_MATCH_TRASHEDアプリは お気に入りとしてマークされたアイテムのみ あるいは、ゴミ箱に入っているもの。
  • 増分変化検出: 次のような列 GENERATION_ADDED y GENERATION_MODIFIED これらを使用すると、前回の同期以降に追加または変更された要素をすばやく確認できます。これは、バックアップアプリや高度なギャラリーにとって非常に重要な機能です。
  • ユーザー制御による一括操作: 方法など createDeleteRequest(), createTrashRequest(), createFavoriteRequest() o createWriteRequest() アプリを許可する バッチ変更を提案するしかし、最終的な決定権はユーザーにあるように、確認ダイアログを表示するのはシステム側です。
  • EXIFの読み書き: スルー ExifInterfaceアプリは、向き、撮影時間、カメラモデル、位置情報(利用可能でユーザーが許可している場合)、その他のメタデータなどのフィールドを読み取ることができます。これは、 写真を正しく回転させたり、時系列順に並べたり、撮影データを表示したりする.

メディアプロバイダー、クラウドストレージ、フォトピッカー

メディアプロバイダーとクラウドストレージ

最新のフォトピッカーやクラウドベースのメディアプロバイダーの登場により、写真や動画の選択ワークフローにおいて、メディアプロバイダーの役割はさらに重要性を増している。

Androidでは、特定のアプリ(通常はメーカーが指定するクラウド写真サービス)がCloudMediaProviderとして機能することが許可されています。これらのアプリはクラウドに保存されているコンテンツを写真選択画面に提供することで、ユーザーがローカルファイルだけでなく、リモートサービスに保存されているファイルも選択できるようにします。

このシナリオでは、MediaProviderとPhoto Pickerは連携して動作します。

  1. システムは優先クラウドプロバイダーを初期化し、定期的に同期します。 マルチメディアメタデータ 写真選択バックエンドと連携して。
  2. アプリが次のようなインテントを使用してフォトピッカーを起動する場合 ACTION_PICK_IMAGES o ACTION_GET_CONTENT、セレクタ 単一のグリッドに結合する MediaProviderによって提供されるローカル要素と、CloudMediaProviderによって提供されるリモート要素。
  3. ユーザーがスクロールすると、セレクターがプロンプトを表示します 最適化されたサムネイル 供給業者に連絡して、迅速かつ効率的な積み込みを実現する。
  4. 選択が完了すると、クラウドコンテンツが選択された場合、システムは以下を生成します。 セキュアURI そしてMediaProviderは、FUSEやその他のレイヤーを通じて、実際のデータへのアクセスを調整し、常に権限とプライバシーを保護します。

CloudMediaProvider は、次のようなメソッドを公開しています。 onQueryMedia(), onQueryDeletedMedia(), onQueryAlbums(), onOpenMedia() u onOpenPreview()写真ピッカーは、アイテム、アルバム、削除済みコンテンツを一覧表示したり、プレビューとファイル全体を開くためにこれらを使用します。これらのメソッドは MediaProvider の外部で実装されていますが、システムのメディアモジュールはこれらと統合して、 ローカルメディアとクラウドメディアへのアクセスにおける一貫した体験.

メディアプロバイダーと互換性のあるビデオトランスコーディング

ビデオトランスコーディングおよびメディアプロバイダー

MediaProviderが重要な役割を果たすもう1つの高度な機能は、互換性のあるメディアコンテンツのトランスコーディングです。この機能により、デバイスはHEVCや特定のHDRプロファイルなどの最新の効率的なビデオフォーマットを、AVC(H.264)などの従来のフォーマットしか理解できない古いアプリとの互換性を損なうことなく使用できます。

その仕組みは以下のとおりです。

  • メーカーとユーザーはカメラを次のように構成できます デフォルトではHEVCで記録します あるいは、容量や帯域幅をより効率的に利用できる他のフォーマット。
  • アプリが HEVCをサポートしていません MediaStore と MediaProvider を介してビデオを開こうとすると、システムは ファイルの読み取りを傍受する FUSE(Filesystem in Userspace)の使用のおかげです。
  • アプリがフォーマットをサポートしていないことが検出された場合、MediaProvider は、 メディアトランスコーディングサービスバックグラウンド変換を開始し、AVC またはその他の互換性のある形式でバージョンを生成します。
  • アプリは、既にトランスコードされたバージョン(または、アプリがその形式をサポートしている場合はオリジナル)を指すファイル記述子を受け取りますが、その仕組みは開発者にとって完全に透過的です。

このトランスコーディング処理は、不正利用を防ぐために時間とリソースの制限によって制御されています。例えば、一定の長さまでの動画のみが処理され、アプリごとの連続セッション数や合計処理時間にも制限があります。これらの制限を超えた場合、システムは処理されていない元のファイルを返します。

これを実現するために、アーキテクチャにはいくつかのコンポーネントが含まれています。

  • メディアトランスコーディングマネージャー: MediaProviderやフレームワークの他の部分がトランスコーディングサービスと通信できるようにするシステムAPI。
  • メディアトランスコーディングサービス: トランスコーディングキュー、アクティブセッション、およびコーデックリソースの割り当てを管理するサービス。
  • メディアトランスコーダー: フォーマット間の変換を実行するネイティブライブラリ MediaCodec また、HDRからSDRへの変換などの操作のための、OEM向けアドオンの可能性もある。

MediaProvider はこのフロー全体の中核を担っています。ファイル読み取りの試みをインターセプトし、アプリの機能に応じてトランスコーディングが必要かどうかを判断し、最終的に元のファイルまたはトランスコードされたファイルのいずれかに適切な記述子を配信するモジュールです。

カスタマイズと拡張: 開発者とメーカー向けの MediaProvider

開発者およびメディアプロバイダー

MediaProviderの最も強力でありながら、あまり知られていない機能の一つに、動作をカスタマイズできる機能があります。これはカスタムROM開発者、OEM、メーカーにとって特に重要な機能ですが、特定のストレージ形式やパスでデバイスの動作が多少異なる理由を理解する上でも役立ちます。

カスタムメディアフォーマット

メーカーは、独自のメディアフォーマットや一般的でないメディアフォーマットのサポートを追加できます。新しいフォーマットごとに、以下のことを行う必要があります。

  • 登録する 固有のファイル拡張子 そして、特定のMIMEタイプに関連付ける MimeUtils.
  • モジュールを設定する メディア抽出ツール そうすることで、その形式のメタデータを読み取ることができ、MediaProvider がそれを正しくインデックス化できるようになります。
  • の場合 video/* y audio/*引き続き MediaMetadataRetriever 関連するメタデータを公開する。
  • の場合 image/*拡張または使用する android.media.ExifInterface 抽出して返す 正規化されたEXIFメタデータ 独自の画像フォーマットでも。

デバイス間の不整合や競合を避けるため、AOSPで既に定義されている拡張子やMIMEタイプを再定義することは許可されていないことに注意することが重要です。

インデックスを作成するストレージデバイスの選択

MediaProvider は、デフォルトでは、返されるすべてのボリュームをインデックス化します。 StorageManager.getStorageVolumes() どこ StorageVolume.getMediaStoreVolumeName() ゼロではありません。ただし、OEMは 索引付けする巻を絞り込む ブランドを確立する VolumeInfo.MOUNT_FLAG_INDEXABLE メディアライブラリに表示させたいデバイス上で。

頻繁に接続・切断される一部のUSB OTGドライブなど、一時的なボリュームをインデックス対象としてマークすることは、データベースの不整合やボリュームが突然消失することによるエラーを防ぐため、避けることをお勧めします。

MTPスタックの交換とカスタマイズ

モバイルデバイスとPC間でUSB経由でファイルを転送するために使用されるMTP(Media Transfer Protocol)のロジックは、MediaProviderモジュールから分離されました。特定のバージョン以降、MTPスタックはモジュールの外部に完全に配置され、公開APIとシステムAPIのみを使用して動作することが保証されています。

これにより、特定の転送ソリューションを必要とするメーカーは、 MediaStoreおよびMediaProviderとの契約との互換性を維持する限り、MTPスタックを置き換えたり、適応させたりすることが可能になり、コンピュータからのファイルのコピーや読み取りの操作感を一貫して維持できます。

デフォルトフォルダと除外リスト

ストレージボリュームが最初にアクティブ化されると、MediaProvider は通常、一連の 標準フォルダ として Music/, Podcasts/, Ringtones/, Alarms/, Notifications/, Pictures/, Movies/, Download/, DCIM/, Documents/, Audiobooks/ y Recordings/ (最後の項目は、一部の旧バージョンでは利用できません。)

特定の組織要件を持つデバイスの場合、OEM は 除外するフォルダのリスト リソースオーバーレイによる初期作成時 config_foldersToSkipInDefaultCreationしたがって、例えば、デフォルトでフォルダが作成されないようにすることができる。 Notifications/ o Ringtones/ 彼らが既に代替システムを持っている場合。

MediaProvider の依存関係と技術要件

メディアプロバイダーの技術要件

MediaProviderをカスタマイズする際、OEMはすべてが正しく機能し続けることを保証するために、いくつかの技術的な依存関係を考慮する必要があります。

  • 使用するとき 非標準マルチメディアファイル形式各フォーマットは両方に登録する必要があります MimeUtils モジュールのように メディア抽出ツールそうしないと、MediaProviderはそれらをインデックス化したり、完全なメタデータを提供したりすることができなくなります。
  • カスタムストレージデバイスセット(SDスロット、内蔵USBポートなど)がインデックス化されるようにするには、 StorageManagerService 必要なボリュームをマークする必要があります VolumeInfo.MOUNT_FLAG_INDEXABLE.
  • カスタム MTP スタックを使用する場合は、 公開APIおよびシステムAPI MediaStoreとの互換性を維持し、PCとデバイスのメディアライブラリ間の連携を損なわないようにするため。

さらに、ビデオトランスコーディングにおいては、デバイスは一定の最低限のハードウェア要件を満たす必要があります。具体的には、ネイティブカメラでHEVCエンコーディングが有効になっていること、ストレージにおける十分な読み書き性能、および変換タスクにおいて高い処理速度を実現できるコーデックなどが挙げられます。

メディアプロバイダーのテスト、診断、およびよくあるエラー

MediaProviderに関する一般的な問題

通常の使用状況では、MediaProviderはほとんど意識されることはありません。しかし、他のシステムコンポーネントと同様に、予期せぬシャットダウン、特定のファイルの読み取り時のエラー、メタデータの更新時の失敗、破損したボリュームのスキャン時のクラッシュなど、問題が発生する可能性があります。

Androidのエコシステムには、その正常な動作を確認するための自動テストがいくつかあります。

  • CtsProviderTestCases: テストセットの 互換性テストスイート これは、MediaStoreの公開APIの動作をMediaProviderと比較して検証するものです。
  • メディアプロバイダーテスト: 内部テストは、モジュールとその構成要素の具体的な動作に焦点を当てて実施された。

開発者や技術者は、次のようなコマンドを使用してこれらのテストスイートを実行できます。

atest --test-mapping packages/providers/MediaProvider

技術フォーラムでは、一部のユーザーが報告している メディアプロバイダーのクラッシュが頻繁に発生する メモリエラーのため(OutOfMemoryError特に、非常に大きなビデオコレクションをスキャンする場合や、破損したSDカードのパーティションを処理する場合などには、以下の点に注意が必要です。

  • チェックしてください 内部メモリと外部メモリの物理的状態 (エラーがある場合は、カードをフォーマットするか交換してください。)
  • システムと 更新されたメインラインモジュール Google Playから修正を受け取る。
  • アプリが生成しているかどうかを確認してください 破損したファイル、またはメタデータに異常があるファイル インデックス作成の失敗を引き起こすもの。

MediaProviderに関連するツールとユーティリティ

メインラインモジュールを表示するためのツール

MediaProviderの更新方法やインストールされているMainlineモジュールについて詳しく知りたい場合は、以下のツールを使用できます。

  • メインラインアップデーター: シンプルなアプリで、 お使いのデバイスに搭載されているメインラインモジュール また、Google Playのシステムアップデートパネルへのショートカットも提供されます。これは、MediaProviderやその他の重要なコンポーネントが最新の状態になっているかどうかを確認する際に便利です。
  • メディアプロバイダーマネージャー: オープンソースの Xposed モジュールで、 MediaStoreの使用状況を監視し、制限する アプリによって制御されます。この機能を使えば、上級ユーザーはどのアプリケーションが最も多くのリクエストを行っているか、どのような権限を行使しているかを確認したり、特定のアクセスを制限してプライバシーを向上させたりすることができます。

こうしたツールは一般ユーザーにとって必須ではないが、 Android端末上でのマルチメディアの動作やプライバシーをより細かく管理したいユーザーにとっては、追加の制御機能を提供する。

MediaProviderはAndroidシステムの中心的なコンポーネントとなっています。マルチメディアコンテンツを効率的に整理し、スコープ付きストレージによってプライバシーをより適切に保護し、最新フォーマットのトランスコーディングを容易にし、Mainlineモジュールのおかげで自動的にアップデートされます。この目に見えないコンポーネントの仕組みを理解することで、ギャラリー、音楽アプリ、クラウドサービスが、以前の世代のシステムよりも高速かつ安定して、そしてはるかに安全に動作する理由が分かります。


Googleで優先ソースとして追加する