MediaPlayer class can be used to control playback of audio files. We tried coding the function of playback, pause, and stop of music using the class.
機能
Start 曲の再生
Pause 曲の一時停止
Stop 曲の停止
オーディオファイルの格納
/res/raw配下に置きます。今回はmusic.mp3というオーディオファイルをそこに置きました。マイクロカードに置いて再生することもできるようですが、その際はコード中にファイルパスを指定するメソッドを呼び出す必要があります。
MediaPlayerクラスに含まれるメソッド
create MediaPlayerオブジェクトを生成
isPlaying 再生状態の確認
prepare 再生準備
start 再生開始
pause 一時停止
stop 停止
再生制御
まず、createでMediaPlayerオブジェクトを生成します。その後、startで曲の再生状態となります。再生状態中にpause、stopを呼び出すとそれぞれ一時停止状態、停止状態になります。一時停止状態からstartを呼び出すと再生状態となりますが、停止状態からstartを呼び出しても再生状態にはなりません。停止状態から再生状態へするためにはprepareを挟む必要があります(stop→prepare→start)。
ソースコード
/SGL/src/sgl/example/media/MusicPlayer.java
package sgl.example.media; import java.io.IOException; import android.app.Activity; import android.media.MediaPlayer; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; public class MusicPlayer extends Activity implements OnClickListener{ View startButton; View pauseButton; View stopButton; MediaPlayer mediaPlayer; boolean stop = false; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mediaPlayer = MediaPlayer.create(this, R.raw.music); setContentView(R.layout.main); startButton = this.findViewById(R.id.start_button); startButton.setOnClickListener(this); pauseButton = this.findViewById(R.id.pause_button); pauseButton.setOnClickListener(this); stopButton = this.findViewById(R.id.stop_button); stopButton.setOnClickListener(this); } @Override public void onDestroy() { super.onDestroy(); mediaPlayer.release(); } public void onClick(View v) { switch (v.getId()) { case R.id.start_button: if (mediaPlayer.isPlaying()){ break; } if (stop) { try { mediaPlayer.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } stop = false; } mediaPlayer.start(); break; case R.id.pause_button: mediaPlayer.pause(); break; case R.id.stop_button: mediaPlayer.stop(); stop = true; break; } } }
実行結果
端末
再生→一時停止の繰り返しは正常に動作するのですが、再生→停止は正常動作しないことがよくありました。おそらく、リソースがうまく解放されていないか、状態遷移のタイミングがずれていることが原因ではないかと予想しているのですが、結局この原因はよく分かりませんでした。。
シミュレータ
再生→一時停止、または再生→停止の繰り返しは正常に動作しました。しかし、停止を押下したときの動作は一時停止であり、停止→再生で曲の最初から再生されることはありませんでした。この原因もよく分からなかったです。。
結局、制御がうまくできませんでした。。扱いが難しいです。
0 件のコメント:
コメントを投稿