MediaStore APIは、デバイスの共有メディアファイル(画像、動画、音声、ドキュメント)にアクセスするためのAndroidインターフェースです。直接ファイルアクセスとは異なり、MediaStoreは集中管理されたメディアデータベースとコンテンツプロバイダーを介して動作します。Android Developers Documentation(2025)によると、Android 10以降、このAPIは従来のREAD_EXTERNAL_STORAGEに代わり、メディア操作の主要なメカニズムになりました。開発者はギャラリー、音楽プレーヤー、カメラ、ファイルマネージャーでMediaStoreを使用しています。
重要なポイント
MediaStore APIは、Androidプラットフォーム上のシステムコンテンツプロバイダーであり、デバイスのメディアファイルをインデックス化、保存、およびアクセスを提供するために設計されています。このAPIはAndroid SDKの一部であり、API Level 1から利用可能です。
MediaStoreは、デバイスを自動的にスキャンしてすべてのメディアファイルのメタデータを収集する統合メディアデータベースを介して動作します。データベースはファイルが追加、変更、削除されるとシステムによって更新されるため、アプリケーションは手動スキャンなしで常に最新情報を取得できます。
MediaStoreの主要テーブルは次のとおりです:Images(画像)、Video(動画)、Audio(音声)、Files(一般ファイル)。各テーブルにはメタデータを含むカラム(名前、作成日、サイズ、MIMEタイプ、GPS座標など)があります。
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はコンテンツプロバイダーアーキテクチャに基づいて構築されており、各アプリケーションはContentResolverとUriを介してアクセスします。システムメディアスキャナーMediaScannerConnectionは、起動時、USB接続時、または再起動時にデバイス上のすべてのファイルを自動的にインデックス化します。
メディアデータベースはシステムデータベースに保存され、各メディアファイルのレコードを保持します。カラムはタイプによって異なります:画像にはORIENTATIONとDATE_TAKEN、動画にはDURATION、音声ファイルにはARTISTとALBUMがあります。開発者はprojectionとselectionを指定したqueryを使用して、SQLのようなクエリを実行できます。
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://media/external/images/media/1234のようなContent URIで識別されます。外部URIは共有ストレージを指し、内部URIはシステムメディアファイルを指します。ファイルパスの代わりにURIを使用することがMediaStoreの主な利点です:アプリケーションはファイルシステムアクセスを必要とせず、安全なコンテンツプロバイダーを介して動作します。
MediaStoreは4つの主要メディアタイプをサポートしており、それぞれに独自のテーブルとメタデータセットがあります。開発者はアプリケーションが扱うコンテンツタイプに応じて適切なテーブルを選択します。
標準カラムに加えて、各テーブルにはシステムフィールド(_ID、DATA(非推奨)、SIZE、MIME_TYPE、DATE_ADDED、DATE_MODIFIED)が含まれます。Android 10以降、DATAフィールドは非推奨とマークされており、開発者はURIを介してInputStreamを開いて作業する必要があります。
MediaStoreには明示的な権限が必要であり、Androidのバージョンによって異なります。Android 13より前は、単一のREAD_EXTERNAL_STORAGE権限が使用されていました。Android 13(API 33)以降、Googleはメディアタイプごとに詳細な権限を導入しました。
| メディアタイプ | 権限(API 33+) | 従来(API 29–32) |
|---|---|---|
| 画像 | READ_MEDIA_IMAGES | READ_EXTERNAL_STORAGE |
| 動画 | READ_MEDIA_VIDEO | READ_EXTERNAL_STORAGE |
| 音声 | READ_MEDIA_AUDIO | READ_EXTERNAL_STORAGE |
| 書き込み | WRITE_EXTERNAL_STORAGE | WRITE_EXTERNAL_STORAGE |
MediaStoreへの書き込みには、Android 9以下ではWRITE_EXTERNAL_STORAGEも必要です。Android 10以降、アプリケーションは追加の権限なしでMediaStoreに自身のファイルを書き込むことができます — ContentResolver.insertを介してレコードを挿入すると、システムが自動的にアクセスを許可します。
MediaStoreの権限は、標準のActivityResultContracts.RequestMultiplePermissionsメカニズムを介してリクエストされます。ユーザーがリクエストを拒否する可能性があるため、アプリケーションはこのシナリオを適切に処理する必要があります。MediaStoreにアクセスする前に、ContextCompat.checkSelfPermissionで権限を確認することを推奨します。
MediaStoreを使用すると、メディアファイルの読み取りだけでなく書き込みも可能です。画像や動画を書き込むには、開発者はContentResolver.insertを使用し、返されたURIのOutputStreamを開きます。システムは自動的にファイルをメディアデータベースに追加してインデックス化します。
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 ->
// ストリームにバイトを書き込む
}
}
削除は、ファイルのURIを指定してContentResolver.deleteを使用して実行されます。システムはアクセス権を確認します:ファイルが現在のアプリケーションに属する場合、追加の権限なしで削除が行われます。Android 10+で他のアプリケーションのファイルを削除するには、システムダイアログを介したユーザーの確認が必要です。
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は、システムピッカーを介して任意のドキュメントを選択するために使用されます。
よくある質問
MediaStore APIは、デバイスのメディアファイル(画像、動画、音声、ドキュメント)にアクセスするためのAndroidシステムコンテンツプロバイダーです。APIはContentResolverと、すべてのファイルを自動的にインデックス化するメディアデータベースを介して統一インターフェースを提供します。
MediaStoreはImages(画像)、Video(動画)、Audio(音声)、Files(ドキュメント)をサポートしています。各タイプには独自のテーブルとメタデータセットがあります:画像にはORIENTATION、動画にはDURATION、音声ファイルにはARTISTがあります。
Android 13+では詳細な権限が使用されます:画像にはREAD_MEDIA_IMAGES、動画にはREAD_MEDIA_VIDEO、音声にはREAD_MEDIA_AUDIO。ユーザーは特定のメディアタイプにのみアクセスを許可できます。
書き込むには、名前とMIMEタイプを持つContentValuesを作成し、ContentResolver.insertを呼び出してURIを取得し、ContentResolver.openOutputStreamを介してOutputStreamを開きます。システムは自動的に新しいファイルをインデックス化します。
MediaStoreはメディアデータベースを介してデバイスのすべてのメディアファイルへのプログラムによるアクセスを提供します。Storage Access Frameworkはシステムファイル選択ダイアログを開き、URIを返します — ユーザーが特定のファイルまたはフォルダーを選択します。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。