非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

AndroidでMediaPlayerを使って音声をループ再生する方法

   

Androidアプリで音声を再生するには標準ライブラリの MediaPlayer を使うのが最もシンプルな方法です。この記事ではassetsフォルダに置いたmp3ファイルをループ再生する方法を状態管理の注意点も含めて解説します。

MediaPlayerの基本的な使い方

MediaPlayerには状態という概念があります。「初期化前」「準備完了」「再生中」などの状態があり、正しい順序でメソッドを呼ばないと IllegalStateException が発生します。まずはその流れを把握しておきましょう。

new MediaPlayer()
  → setDataSource()
  → prepare()
  → start()
  → pause() / stop()
  → release()
 

 

この順序を守ることが、MediaPlayerを扱う上での最大のポイントです。

assetsフォルダのmp3を再生する

assetsフォルダに置いたファイルは、通常のファイルパスでは指定できません。AssetFileDescriptor を使って「ファイルのどの位置に、どの長さで格納されているか」を明示的に渡す必要があります。

AssetFileDescriptor fd = getAssets().openFd("sample.mp3");

MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(
    fd.getFileDescriptor(),
    fd.getStartOffset(),
    fd.getLength()
);
fd.close();

mediaPlayer.setLooping(true); // ループ再生ON
mediaPlayer.prepare();        // 読み込み
mediaPlayer.start();          // 再生開始
 

 

setDataSource() に3つの引数を渡しているのがポイントです。assetsのファイルはビルド時に1つの大きなファイルにまとめられるため、開始位置(startOffset)と長さ(length)で範囲を指定する必要があります。ループ再生は setLooping(true) を呼ぶだけです。これだけで、start() 後は音声が自動的に繰り返されます。

音声を切り替えるときはreleaseを忘れずに

別の音声に切り替えるときは、古いMediaPlayerを必ず破棄してから新しいインスタンスを作ります。

if (mediaPlayer != null) {
    mediaPlayer.stop();
    mediaPlayer.release(); // メモリ解放
    mediaPlayer = null;
}
// → 新しいMediaPlayerを生成してsetDataSource()へ
 

release() を呼ばずに新しいインスタンスを作り続けると、音声リソースがメモリに残り続けます。切り替え時は必ず stop() → release() をセットで呼ぶ習慣をつけましょう。

バックグラウンドに移ったときの制御

アプリが画面から離れたときも音声が流れ続けるのは、ユーザー体験として好ましくありません。onPause() と onResume() を使って制御します。

@Override
protected void onPause() {
    super.onPause();
    if (mediaPlayer != null) {
        mediaPlayer.pause();
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (mediaPlayer != null) {
        mediaPlayer.start();
    }
}
 

 

onPause() で一時停止し、onResume() で再開することで、他のアプリに切り替えたときに音声が止まり、戻ってきたときに続きから再生されます。

アプリ終了時のクリーンアップ

onDestroy() でも忘れずに解放処理を行います。

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer = null;
    }
}
 

 

release() はOSの音声リソースを返却する処理です。呼び忘れると他のアプリの音声再生に影響が出ることもあるため、必ず実装してください。

まとめ

MediaPlayerを使った音声再生で押さえておくべき点は3つです。

  1. 状態の順序を守る — setDataSource() → prepare() → start() の順に呼ぶ
  2. 切り替え時はreleaseする — stop() → release() をセットで忘れずに
  3. ライフサイクルに合わせて制御する — onPause() で止めて onResume() で再開、onDestroy() で解放

シンプルなAPIながら状態管理がシビアなのがMediaPlayerの特徴です。この3点を意識するだけで、メモリリークや予期しない動作を防ぐことができます。

 

スポンサーリンク

 - Androidプログラミング, Java