MediaStore API:概要、機能、共有メディアファイルの操作

著者: IT Sectr 公開日: 2026-07-10 読了時間: 7 分

MediaStore APIは、デバイスの共有メディアファイル(画像、動画、音声、ドキュメント)にアクセスするためのAndroidインターフェースです。直接ファイルアクセスとは異なり、MediaStoreは集中管理されたメディアデータベースとコンテンツプロバイダーを介して動作します。Android Developers Documentation(2025)によると、Android 10以降、このAPIは従来のREAD_EXTERNAL_STORAGEに代わり、メディア操作の主要なメカニズムになりました。開発者はギャラリー、音楽プレーヤー、カメラ、ファイルマネージャーでMediaStoreを使用しています。

重要なポイント

  • MediaStoreは、デバイスの共有メディアファイルにアクセスするためのAndroidシステムコンテンツプロバイダーです。
  • メディアデータベースは、デバイス上のすべての画像、動画、音声を集中的にインデックス化します。
  • Android 10により、MediaStoreが共有メディアファイルにアクセスする唯一の方法になりました。
  • URIリンクが直接ファイルパスに代わり、安全なアクセスを保証します。
  • 権限はメディアタイプごとにリクエストされます:READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO。

MediaStore APIとは?

MediaStore APIは、Androidプラットフォーム上のシステムコンテンツプロバイダーであり、デバイスのメディアファイルをインデックス化、保存、およびアクセスを提供するために設計されています。このAPIはAndroid SDKの一部であり、API Level 1から利用可能です。

MediaStoreは、デバイスを自動的にスキャンしてすべてのメディアファイルのメタデータを収集する統合メディアデータベースを介して動作します。データベースはファイルが追加、変更、削除されるとシステムによって更新されるため、アプリケーションは手動スキャンなしで常に最新情報を取得できます。

MediaStoreの主要テーブルは次のとおりです:Images(画像)、Video(動画)、Audio(音声)、Files(一般ファイル)。各テーブルにはメタデータを含むカラム(名前、作成日、サイズ、MIMEタイプ、GPS座標など)があります。

AndroidバージョンにおけるMediaStoreの進化

Android 10より前は、開発者はREAD_EXTERNAL_STORAGEを使用してすべてのデバイスファイルにアクセスしていました。Android 10(API 29)でスコープ付きストレージが導入され、アプリケーションは自身のファイルとMediaStoreを介してのみアクセスできるようになりました。Android 11ではポリシーがさらに厳格化され、共有ディレクトリへの直接パスが完全にブロックされました。

Android 13(API 33)以降、GoogleはREAD_EXTERNAL_STORAGEを詳細な権限(READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO)に置き換えました。これにより、ユーザーはストレージ全体を公開せずに特定のメディアタイプへのアクセスのみを許可できます。

MediaStoreの仕組み:アーキテクチャとメディアデータベース

MediaStoreはコンテンツプロバイダーアーキテクチャに基づいて構築されており、各アプリケーションはContentResolverとUriを介してアクセスします。システムメディアスキャナーMediaScannerConnectionは、起動時、USB接続時、または再起動時にデバイス上のすべてのファイルを自動的にインデックス化します。

メディアデータベースはシステムデータベースに保存され、各メディアファイルのレコードを保持します。カラムはタイプによって異なります:画像にはORIENTATIONDATE_TAKEN、動画にはDURATION、音声ファイルにはARTISTALBUMがあります。開発者はprojectionとselectionを指定したqueryを使用して、SQLのようなクエリを実行できます。

kotlin
val projection = arrayOf(
    MediaStore.Images.Media._ID,
    MediaStore.Images.Media.DISPLAY_NAME,
    MediaStore.Images.Media.DATE_ADDED
)

val cursor = contentResolver.query(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    projection,
    null,
    null,
    MediaStore.Images.Media.DATE_ADDED + " DESC"
)

cursor?.use {
    while (moveToNext()) {
        val name = getString(getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME))
    }
}

Content URIとその意味

各メディアファイルは、content://media/external/images/media/1234のようなContent URIで識別されます。外部URIは共有ストレージを指し、内部URIはシステムメディアファイルを指します。ファイルパスの代わりにURIを使用することがMediaStoreの主な利点です:アプリケーションはファイルシステムアクセスを必要とせず、安全なコンテンツプロバイダーを介して動作します。

MediaStoreのメディアファイルタイプ

MediaStoreは4つの主要メディアタイプをサポートしており、それぞれに独自のテーブルとメタデータセットがあります。開発者はアプリケーションが扱うコンテンツタイプに応じて適切なテーブルを選択します。

  • MediaStore.Images — 写真、スクリーンショット、画像。カラム:BUCKET_DISPLAY_NAME、IS_PRIVATE、LATITUDE、LONGITUDE。
  • MediaStore.Video — 動画録画と映画。カラム:DURATION、RESOLUTION、IS_DRM。
  • MediaStore.Audio — 音楽トラックとサウンドファイル。カラム:ARTIST、ALBUM、COMPOSER、TRACK。
  • MediaStore.Files — ドキュメントとその他のファイル。Android 10から共有アクセスで利用可能。

標準カラムに加えて、各テーブルにはシステムフィールド(_IDDATA(非推奨)、SIZEMIME_TYPEDATE_ADDEDDATE_MODIFIED)が含まれます。Android 10以降、DATAフィールドは非推奨とマークされており、開発者はURIを介してInputStreamを開いて作業する必要があります。

MediaStoreを使用するための権限

MediaStoreには明示的な権限が必要であり、Androidのバージョンによって異なります。Android 13より前は、単一のREAD_EXTERNAL_STORAGE権限が使用されていました。Android 13(API 33)以降、Googleはメディアタイプごとに詳細な権限を導入しました。

メディアタイプ権限(API 33+)従来(API 29–32)
画像READ_MEDIA_IMAGESREAD_EXTERNAL_STORAGE
動画READ_MEDIA_VIDEOREAD_EXTERNAL_STORAGE
音声READ_MEDIA_AUDIOREAD_EXTERNAL_STORAGE
書き込みWRITE_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE

MediaStoreへの書き込みには、Android 9以下ではWRITE_EXTERNAL_STORAGEも必要です。Android 10以降、アプリケーションは追加の権限なしでMediaStoreに自身のファイルを書き込むことができます — ContentResolver.insertを介してレコードを挿入すると、システムが自動的にアクセスを許可します。

実行時の権限リクエスト

MediaStoreの権限は、標準のActivityResultContracts.RequestMultiplePermissionsメカニズムを介してリクエストされます。ユーザーがリクエストを拒否する可能性があるため、アプリケーションはこのシナリオを適切に処理する必要があります。MediaStoreにアクセスする前に、ContextCompat.checkSelfPermissionで権限を確認することを推奨します。

コード例:MediaStoreでの読み取りと書き込み

MediaStoreを使用すると、メディアファイルの読み取りだけでなく書き込みも可能です。画像や動画を書き込むには、開発者はContentResolver.insertを使用し、返されたURIのOutputStreamを開きます。システムは自動的にファイルをメディアデータベースに追加してインデックス化します。

kotlin
val values = ContentValues().apply {
    put(MediaStore.Images.Media.DISPLAY_NAME, "photo_2025.jpg")
    put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg")
    put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/MyApp")
}

val uri = contentResolver?.insert(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values
)

uri?.let {
    val outputStream = contentResolver?.openOutputStream(it)
    outputStream?.use { stream ->
        // ストリームにバイトを書き込む
    }
}

MediaStoreを介したメディアファイルの削除

削除は、ファイルのURIを指定してContentResolver.deleteを使用して実行されます。システムはアクセス権を確認します:ファイルが現在のアプリケーションに属する場合、追加の権限なしで削除が行われます。Android 10+で他のアプリケーションのファイルを削除するには、システムダイアログを介したユーザーの確認が必要です。

MediaStoreと直接ファイルアクセスの比較

MediaStore APIは、File APIを介した直接ファイルアクセスとは根本的に異なります。ファイルパスの代わりにContent URIが使用され、ファイル操作の代わりにContentResolverメソッドが使用されます。これにより、セキュリティ、自動インデックス化、統一インターフェースという3つの主要な利点が得られます。

直接ファイルアクセスは、Android 10+では共有ディレクトリに対して制限されています。MediaStoreはPictures、DCIM、Movies、Music、Downloadからメディアを読み取る唯一の方法です。アプリケーション固有のファイル(app-specific storage)については、直接アクセスが維持されています — これらはAndroid/dataとAndroid/mediaのフォルダーです。

MediaStoreと直接アクセスの選択は、コンテンツタイプによって異なります。MediaStoreは他のアプリケーションがアクセスできる共有メディアファイルに必須です。直接File APIはアプリケーションの内部ファイルとキャッシュに適しています。Storage Access Frameworkは、システムピッカーを介して任意のドキュメントを選択するために使用されます。

よくある質問

AndroidのMediaStore APIとは?

MediaStore APIは、デバイスのメディアファイル(画像、動画、音声、ドキュメント)にアクセスするためのAndroidシステムコンテンツプロバイダーです。APIはContentResolverと、すべてのファイルを自動的にインデックス化するメディアデータベースを介して統一インターフェースを提供します。

MediaStoreはどのメディアタイプをサポートしていますか?

MediaStoreはImages(画像)、Video(動画)、Audio(音声)、Files(ドキュメント)をサポートしています。各タイプには独自のテーブルとメタデータセットがあります:画像にはORIENTATION、動画にはDURATION、音声ファイルにはARTISTがあります。

Android 13でMediaStoreに必要な権限は?

Android 13+では詳細な権限が使用されます:画像にはREAD_MEDIA_IMAGES、動画にはREAD_MEDIA_VIDEO、音声にはREAD_MEDIA_AUDIO。ユーザーは特定のメディアタイプにのみアクセスを許可できます。

MediaStoreを介してファイルを書き込むには?

書き込むには、名前とMIMEタイプを持つContentValuesを作成し、ContentResolver.insertを呼び出してURIを取得し、ContentResolver.openOutputStreamを介してOutputStreamを開きます。システムは自動的に新しいファイルをインデックス化します。

MediaStoreとStorage Access Frameworkの違いは?

MediaStoreはメディアデータベースを介してデバイスのすべてのメディアファイルへのプログラムによるアクセスを提供します。Storage Access Frameworkはシステムファイル選択ダイアログを開き、URIを返します — ユーザーが特定のファイルまたはフォルダーを選択します。

まとめ

  • MediaStore APIは、コンテンツプロバイダーとメディアデータベースを介して動作する、Androidメディアファイルにアクセスするための主要メカニズムです。
  • メディアデータベースは画像、動画、音声、ドキュメントを自動的にインデックス化し、ContentResolverを介してメタデータアクセスを提供します。
  • Android 10により、MediaStoreが共有メディアファイルにアクセスする唯一の方法になり、直接ファイルアクセスが制限されました。
  • Android 13は単一のREAD_EXTERNAL_STORAGEに代わり、詳細な権限READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIOを導入しました。
  • Content URIはファイルパスに代わり、他のアプリケーションのファイルへのルート権限なしでの安全なアクセスを保証します。
  • MediaStoreを介した書き込みは、ContentResolver.insertとopenOutputStreamを使用し、メディアデータベースで自動インデックス化されます。
  • 選択はMediaStoreとSAFの間でタスクに応じて異なります:MediaStoreはバッチメディア操作、SAFはユーザーによる個別ファイルの選択に適しています。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください