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

このドキュメントでは、メディア プレーヤーを使用する前に理解しておくべき基本的なコンセプトについて説明します。

音声と動画のクラス

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();

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

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 は、アプリでのメディア再生におすすめのソリューションです。詳細 をご確認ください。

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