前回に引き続き,Android のオーディオ/ビデオ再生用クラス
MediaPlayer を用いて簡単なオーディオプレーヤーを作成する.
今回は、音楽の再生位置を操作できるシークバーを実装を行う.
シークバーの機能を以下のように定義する.
- ユーザが自由に再生位置を操作できる
- 曲の再生に合わせてシークバーの再生位置を示すつまみが動く
音楽再生とシークバーで再生位置を追従するという2つの動作を同時に実行するために,シークバー追従用のスレッドを生成し,ハンドラによって周期的に再生位置を追従する.
スレッドのrunメソッドとシークバー用イベントリスナーは,インターフェイスとして実装する.
以下のコードでは、
前回からの追加部分を赤色で示している.
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class MainActivity extends Activity implements OnClickListener, OnSeekBarChangeListener, Runnable{
private Button playBt;
private Button stopBt;
private MediaPlayer mediaPlayer;
private SeekBar seekBar;
private boolean running;
private Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
playBt = (Button)findViewById(R.id.button1);
stopBt = (Button)findViewById(R.id.button2);
playBt.setOnClickListener(this);
stopBt.setOnClickListener(this);
mediaPlayer = MediaPlayer.create(this, R.raw.sample);
seekBar = (SeekBar)findViewById(R.id.seekBar1);
seekBar.setProgress(0);
seekBar.setMax(mediaPlayer.getDuration());
seekBar.setOnSeekBarChangeListener(this);
running = true;
thread = new Thread(this);
thread.start();
}
// Run the thread using for seekBar
public void run(){
while(running){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
handler.sendMessage(Message.obtain(handler, mediaPlayer.getCurrentPosition()));
}
}
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
seekBar.setProgress(msg.what);
}
};
public void stopRunning(){
running = false;
}
// SeekBar-control
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
;
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
;
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mediaPlayer.seekTo(seekBar.getProgress());
}
// Start mediaPlayer
public void start(){
if (!mediaPlayer.isPlaying()){
mediaPlayer.seekTo(mediaPlayer.getCurrentPosition());
mediaPlayer.start();
}
}
// Pause mediaPlayer
public void pause(){
mediaPlayer.pause();
}
// Stop mediaPlayer
public void stop(){
mediaPlayer.pause();
mediaPlayer.seekTo(0);
}
// Button-control
public void onClick(View v) {
switch(v.getId()){
case R.id.button1: // Play-button
start();
break;
case R.id.button2: // Stop-button
stop();
break;
}
}
// Key-control
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK ||
keyCode == KeyEvent.KEYCODE_HOME){
mediaPlayer.stop();
mediaPlayer.release();
stopRunning();
finish();
return true;
}
return false;
}
}