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つです。
- 状態の順序を守る — setDataSource() → prepare() → start() の順に呼ぶ
- 切り替え時はreleaseする — stop() → release() をセットで忘れずに
- ライフサイクルに合わせて制御する — onPause() で止めて onResume() で再開、onDestroy() で解放
シンプルなAPIながら状態管理がシビアなのがMediaPlayerの特徴です。この3点を意識するだけで、メモリリークや予期しない動作を防ぐことができます。
スポンサーリンク