音声の再生

音声の再生

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の
状態を受け取るためのリスナーを設定し
これらが呼ばれるまで
ボタンのラベルを停止、再生と切り替えるようにしている

コメントを残す

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