[Android]MediaPlayerで音を鳴らす方法

投稿者:

Androidで音を鳴らす方法はいくつかあるがここではMediaPlayerクラスを使う方法を記しておく。

以下のコードは既定のアラーム音を鳴らすプログラムである。

MediaPlayer mediaPlayer;  //メディアプレーヤー
Uri uri;                  //音声ファイルのURI

//警告音の準備
uri=RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
try{
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
    mediaPlayer.setDataSource(this,uri);
    mediaPlayer.setLooping(true);
    mediaPlayer.prepare();
    mediaPlayer.start();
}catch(IOException e){
    e.printStackTrace();
}
.
.
.
.
mediaPlayer.stop();

音源のURIを求めた後、MediaPlayerクラスのインスタンスを作成し、setAudioStreamType(AudioManager.STREAM_ALARM)でアラーム音として再生することを宣言。

ちなみにAndroidは「着信音」「メディア」「アラーム」の三つのサウンドストリームがあってそれぞれ独立して音量を設定することができる。ハードキーで音量をゼロにしたのに電車の中でゲームを起動したら萌え萌えの恥ずかしいアニメ声が流れてしまったという経験はないだろうか? あれはハードキーで「着信音」をゼロにしただけで、ゲームが使う「メディア」の音量はそのままになっているからだ。

それはさておきsetDataSource()で音源を登録。
setLooping(true)でループ再生に設定。

音を鳴らすにはprerare()メソッドで準備してからstart()で再生開始。止めるにはstop()メソッド。
一度stop()で止めたらprepare()を呼ばない限り再生しない。
stop()で止めて、再度再生したら続きから再生される。
最初から再生するときはprepare()のあとにseekTo(0)を呼び、再生位置を先頭に戻す。
prepare()より前にseekTo()を呼んだら例外が発生する。

rawディレクトリにある音声ファイルを再生する方法

自作あるいは既存の音声データを再生するときは、resの中にrawディレクトリを作成し、そこにMP3やWAVファイルをコピーする。Android studioでは新規プロジェクトを作成してもデフォルトでrawディレクトリが作成されないため自分で作成する必要がある。
rawディレクトリにコピーしたファイルはリソースとして登録されるためRオブジェクトからアクセスすることができる。
rawにhappysound.mp3というファイルをコピーした場合

R.raw.happysound

という具合に拡張子を除いた名前で呼び出すことができる。
Uriは

Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.happysound);

というふうに求める。
happysound.mp3をデータソースにしてMediaPlayerのインスタンスを作るには

MediaPlayer mp = MediaPlayer.create(R.raw.happysound);

とする

すでに作成されたMediaPlayerのインスタンスを使いまわすときはsetDataset()メソッドで音源を登録する前にreset()メソッドを呼ぶ必要がある。

mediaPlayer.reset();  //既存のMediaPlayerをリセット
Uri uri=Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.happysound);
mediaPlayer.setDataSource(this,uri);
mediaPlayer.prepare();
mediaPlayer.setLooping(false);
mediaPlayer.seekTo(0);
mediaPlayer.start();

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください