音声の再生
MP3ファイルや、応答性の求められない音声データの再生は
android.mediaパッケージの
MediaPlayerクラスを使う
MediaPlayer.setDataSource()
で音声データを設定し
MediaPlayer.start()で再生する
ほとんどの場合、再生ボタンを押して再生になるので
implements OnClickListener, OnPreparedListener, OnCompletionListener
を追記する
そして、メンバ変数の宣言
private Button playPause; private MediaPlayer mediaPlayer;
そして、onCreate()へ処理を追記する
playPause = (Button)findViewById(R.id.playpause);
playPause.setOnClickListener(this);
playPause.setEnabled(false);
//MediaPlayer 初期化
mediaPlayer = new MediaPlayer();
//再生準備完了の通知を受け取るリスナーの設定
mediaPlayer.setOnPreparedListener(this);
//再生完了の通知を受け取るリスナーの設定
mediaPlayer.setOnCompletionListener(this);
//再生させたい音声データのパス設定
String fileName = "android.resource://" + getPackageName() + "/" + R.raw.bgm;
try{
//音声データをMediaPlayerへ設定
mediaPlayer.setDataSource(this, Uri.parse(fileName));
//音声データを非同期で読み込む
mediaPlayer.prepareAsync();
setButtonText(mediaPlayer);
}catch(IllegalArgumentException e){
e.printStackTrace();
}catch(SecurityException e){
e.printStackTrace();
}catch(IllegalStateException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}
そして、アプリ終了のときの処理
@Override
public void onDestroy(){
super.onDestroy();
//再生中なら停止させる
if(mediaPlayer.isPlaying()){
mediaPlayer.stop();
}
//MediaPlayerの解放
mediaPlayer.release();
}
メモリ操作みたいに解放が必要になる
そして、ボタンを押したら再生、停止する処理
@Override
public void onClick(View v){
if(v.getId() == R.id.playpause){
//再生中なら停止させる
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
setButtonText(mediaPlayer);
}
//再生中でないなら再生させる
else{
mediaPlayer.start();
setButtonText(mediaPlayer);
}
}
}
音楽データが再生可能になったときの処理
@Override
public void onPrepared(MediaPlayer mp){
playpause.setEnabled(true);
setButtonText(mp);
}
そして、音楽の再生終了したときにボタンの状態を変える処理
@Override
public void onCompletion(MediaPlayer mp){
setButtonText(mp);
}
ボタンの状態変化の処理
ここでは、表示されるラベルを変更する
ちなみに、これはユーザー関数
private void setButtonText(MediaPlayer mp){
//再生中なら停止へ
if(mp.playing()){
playpause.setText(getString(R.string.stop));
}
//停止中なら再生へ
else{
playpause.setText(getString(R.string.play));
}
}
MediaPlayerクラスは
内部で音楽情報を保持しているため
呼び出し側は、それを考慮して
start()
pause()
を呼び出さないとだめ
もし、呼び出してはならないほうを使うと
IllegalExceptionが発生する
今回は、MediaPlayerを初期化して
再生準備完了のpreparedと
再生完了の playbackCompletedの
状態を受け取るためのリスナーを設定し
これらが呼ばれるまで
ボタンのラベルを停止、再生と切り替えるようにしている