1パターンのコンストラクタしか書かなかったが、
常に表示できることを目的にした MediaController を書いてみた。
import java.io.IOException;
import java.util.Formatter;
import java.util.Locale;
import org.sample.R;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.SeekBar;
import android.widget.TextView;
/**
* MediaControllerAgent
*/
public class MediaControllerAgent{
private ImageButton mRewImageButton;
private ImageButton mPlayImageButton;
private ImageButton mFfImageButton;
private ImageButton mStopImageButton;
private ProgressBar mProgress;
TextView mTimeCurrentTextView;
TextView mTimeTextView;
static MediaPlayer mediaPlayer;
boolean mIsPrepared = false;
boolean mIsStoped = false;
long mDuration;
StringBuilder mFormatBuilder;
Formatter mFormatter;
int mCurrentBufferPercentage;
boolean mDragging;
Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
if (mediaPlayer.isPlaying()){
int pos = setProgress();
sendMessageDelayed(obtainMessage(1), 1000 - (pos % 1000));
}
}
};
public MediaControllerAgent(View container, MediaPlayer _mediaPlayer){
mRewImageButton = (ImageButton)container.findViewById(R.id.rewImageButton);
mPlayImageButton = (ImageButton)container.findViewById(R.id.playImageButton);
mFfImageButton = (ImageButton)container.findViewById(R.id.ffImageButton);
mStopImageButton = (ImageButton)container.findViewById(R.id.stopImageButton);
mTimeCurrentTextView = (TextView)container.findViewById(R.id.time_currentTextView);
mTimeTextView = (TextView)container.findViewById(R.id.timeTextView);
mTimeCurrentTextView.setText("0:00");
mTimeTextView.setText("0:00");
mediaPlayer = _mediaPlayer;
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener(){
@Override
public void onPrepared(MediaPlayer mp){
mDuration = mp.getDuration();
mTimeCurrentTextView.setText("0:00");
mTimeTextView.setText(stringForTime(mDuration));
mCurrentBufferPercentage = 0;
mIsPrepared = true;
setEnabled(true);
start();
}
});
mediaPlayer.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener(){
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent){
mCurrentBufferPercentage = percent;
}
});
mPlayImageButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
if (!mIsPrepared) return;
if (mediaPlayer.isPlaying()){
pause();
}else{
start();
}
updatePausePlay();
}
});
mStopImageButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
stop();
}
});
mProgress = (ProgressBar)container.findViewById(R.id.mediacontroller_progress);
mProgress.setMax(1000);
*1;
}
@Override
public void onStopTrackingTouch(SeekBar bar){
if (mIsStoped) return;
setProgress();
updatePausePlay();
mHandler.removeMessages(1);
}
});
mRewImageButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
int pos = mediaPlayer.getCurrentPosition();
pos -= 5000; // milliseconds
if (pos < 0) pos = 0;
mediaPlayer.seekTo(pos);
setProgress();
}
});
mFfImageButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
int pos = mediaPlayer.getCurrentPosition();
pos += 15000; // milliseconds
if (pos >= mDuration) pos -= 1000;
mediaPlayer.seekTo(pos);
setProgress();
}
});
// ボタン全て無効
setEnabled(false);
// 時間表示フォーマット
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
}
public boolean isPlaying(){
return mediaPlayer.isPlaying();
}
/**
* 停止時の処理 override して使用することが目的
*/
protected void onStoped(){
}
/*
* 読み込み実行
*/
public void play(String path) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{
mIsStoped = true;
mIsPrepared = false;
mediaPlayer.stop();
mediaPlayer.seekTo(0);
mProgress.setProgress(0);
setEnabled(false);
mTimeCurrentTextView.setText("0:00");
mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
mediaPlayer.setDataSource(path);
mediaPlayer.prepare();
}
protected void start(){
mIsStoped = false;
mediaPlayer.start();
setProgress();
updatePausePlay();
mHandler.sendEmptyMessage(1);
}
protected void stop(){
mIsStoped = true;
mIsPrepared = false;
mediaPlayer.stop();
mediaPlayer.seekTo(0);
mProgress.setProgress(0);
setEnabled(false);
mTimeCurrentTextView.setText("0:00");
mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
// callback 停止処理
onStoped();
}
protected void pause(){
if (mediaPlayer.isPlaying()){
mPlayImageButton.setImageResource(android.R.drawable.ic_media_pause);
}else{
mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
}
mediaPlayer.pause();
}
protected void updatePausePlay(){
if (mediaPlayer.isPlaying()) {
mPlayImageButton.setImageResource(android.R.drawable.ic_media_pause);
}else {
mPlayImageButton.setImageResource(android.R.drawable.ic_media_play);
}
}
protected int setProgress(){
int position = mediaPlayer.getCurrentPosition();
int duration = mediaPlayer.getDuration();
if (duration > 0) {
long pos = 1000L * position / duration;
mProgress.setProgress*2;
mTimeCurrentTextView.setText(stringForTime(position));
return position;
}
protected void setEnabled(boolean b){
mPlayImageButton.setEnabled(b);
mRewImageButton.setEnabled(b);
mFfImageButton.setEnabled(b);
mStopImageButton.setEnabled(b);
mProgress.setEnabled(b);
}
// 時間表示フォーマット
protected String stringForTime(long timeMs){
int totalSeconds = (int)(timeMs / 1000);
int seconds = totalSeconds % 60;
int minutes = (totalSeconds / 60) % 60;
int hours = totalSeconds / 3600;
mFormatBuilder.setLength(0);
if (hours > 0){
return mFormatter.format("%d:%02d:%02d", hours, minutes, seconds).toString();
}
return mFormatter.format("%02d:%02d", minutes, seconds).toString();
}
}
*1:SeekBar)mProgress).setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){
@Override
public void onStartTrackingTouch(SeekBar seekBar){
mDragging = true;
mHandler.removeMessages(1);
}
@Override
public void onProgressChanged(SeekBar bar, int progress, boolean fromuser){
if (!fromuser || mIsStoped) return;
long duration = mediaPlayer.getDuration();
long newposition = (duration * progress) / 1000L;
mediaPlayer.seekTo((int)newposition);
mTimeCurrentTextView.setText(stringForTime(newposition
*2:int)pos);
}
mProgress.setSecondaryProgress(mCurrentBufferPercentage * 10);
mTimeTextView.setText(stringForTime(duration