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