メディア プレーヤーを使ってみる

このドキュメントでは、Media Player を使用する前に理解しておく必要がある基本的なコンセプトについて説明します。

音声と動画のクラス

Android フレームワークで音声と動画を再生するクラスは次のとおりです。

  • MediaPlayer: このクラスは、音声と動画の再生においてメインとなる API です。
  • AudioManager: このクラスは、デバイス上の音声ソースと音声出力を管理します。

マニフェストの宣言

MediaPlayer を使用するアプリの開発を始める前に、関連機能を使えるようにするための宣言がマニフェストに含まれていることを確認してください。

  • インターネット権限: MediaPlayer を使用してネットワークベースのコンテンツをストリーミングする場合は、アプリでネットワーク アクセスをリクエストする必要があります。

    <uses-permission android:name="android.permission.INTERNET" />
    
  • Wake Lock 権限: プレーヤー アプリで画面が暗くならないようにしたり、プロセッサをスリープ状態にしないようにしたり、MediaPlayer.setScreenOnWhilePlaying(boolean) メソッドや MediaPlayer.setWakeMode(android.content.Context, int) メソッドを使用したりする場合は、この権限を要求する必要があります。

    <uses-permission android:name="android.permission.WAKE_LOCK" />
    

MediaPlayer クラスを使用する

MediaPlayer クラスは、メディア フレームワークの重要なコンポーネントです。このクラスのオブジェクトを使用すると、音声と動画の両方のフェッチ、デコード、再生を最小限の設定で行えます。MediaPlayer は、次のような複数のメディアソースをサポートしています。

  • ローカル リソース
  • コンテンツ リゾルバから取得できるような内部 URI
  • 外部 URL(ストリーミング)

Android がサポートするメディア形式の一覧については、サポートされているメディア形式のページをご覧ください。

音声ソースを操作する例

以下に、ローカル生リソースとして利用可能な音声(アプリの res/raw/ ディレクトリに保存されている)を再生する方法の例を示します。

Kotlin

var mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1)
mediaPlayer.start() // no need to call prepare(); create() does that for you

Java

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you

ここで、「生」リソースとは、システムにより特定の方法でパースされないファイルのことです。ただし、リソースの内容は生の音声であってはなりません。適切にエンコードおよびフォーマットされた、サポート対象形式のメディア ファイルである必要があります。

これを、システム内でローカルに利用可能な URI(たとえば、コンテンツ リゾルバから取得したもの)から再生する方法は次のとおりです。

Kotlin

val myUri: Uri = .... // initialize Uri here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(applicationContext, myUri)
    prepare()
    start()
}

Java

Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();

HTTP ストリーミングを使用してリモート URL から再生する方法は次のとおりです。

Kotlin

val url = "http://........" // your URL here
val mediaPlayer = MediaPlayer().apply {
    setAudioAttributes(
        AudioAttributes.Builder()
            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
            .setUsage(AudioAttributes.USAGE_MEDIA)
            .build()
    )
    setDataSource(url)
    prepare() // might take long! (for buffering, etc)
    start()
}

Java

String url = "http://........"; // your URL here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioAttributes(
    new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA)
        .build()
);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();

非同期での準備を使用してパフォーマンスを向上させる

MediaPlayer を使用する際は、パフォーマンスに注意してください。たとえば、prepare() の呼び出しは、メディアデータのフェッチとデコードを伴う可能性があるため、実行に時間がかかる場合があります。そのため、実行に時間がかかる可能性のある他のメソッドと同様、アプリの UI スレッドから呼び出さないようにしなければなりません。UI スレッドから呼び出してしまうと、メソッドが返されるまで UI が応答しなくなり、ユーザー エクスペリエンスの低下や ANR(アプリケーション応答なし)エラーを招く可能性があります。

UI スレッドのハングを回避するには、別のスレッドを生成して MediaPlayer の準備を行い、完了したらメインスレッドに通知するようにします。このタスクを実行する prepareAsync() メソッドを実行する便利な方法がフレームワークに用意されています。このメソッドは、バックグラウンドでメディアの準備を開始すると、すぐに戻ってきます。メディアの準備が完了すると、setOnPreparedListener() で設定した MediaPlayer.OnPreparedListeneronPrepared() メソッドが呼び出されます。

詳細

アプリでのメディア再生には、Jetpack Media3 が推奨されるソリューションです。詳しくは、こちらをご覧ください。

以下は音声と動画の録音、録画、保存、再生に関するトピックを扱うページです。