samedi 3 janvier 2015

MediaPlayer, SeekBar, and Chronometer sync issue

I'm trying to implement a MediaPlayer to play an audio file in a DialogFragment. I've successfully managed to get the SeekBar and Chronometer to progress in sync with the MediaPlayer, but cannot get the MediaPlayer and Chronometer to change properly when I am seeking through the audio file using the SeekBar. (Also, is there a way to get the seekbar to progress smoothly? currently it jumps to the new position every second).



public class PlaybackFragment extends DialogFragment {

private static final String LOG_TAG = "PlaybackFragment";

private static final String ARG_ITEM = "recording_item";
private RecordingItem item;

private Handler mHandler = new Handler();

private static final SimpleDateFormat mLengthFormatter = new SimpleDateFormat("mm:ss", Locale.getDefault());
private MediaPlayer mMediaPlayer = null;

private SeekBar mSeekBar = null;
private FloatingActionButton mPlayButton = null;
private Chronometer mCurrentProgress = null;

private boolean startPlaying = true;
long timeWhenPaused = 0;

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {

Dialog dialog = super.onCreateDialog(savedInstanceState);

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_media_playback, null);

mFileNameTextView = (TextView) view.findViewById(R.id.file_name_text_view);
mFileLengthTextView = (TextView) view.findViewById(R.id.file_length_text_view);
mCurrentProgress = (Chronometer) view.findViewById(R.id.current_progress);

mSeekBar = (SeekBar) view.findViewById(R.id.seekbar);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if(mMediaPlayer != null && fromUser){
mMediaPlayer.seekTo(progress);
}
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
if(mMediaPlayer != null) {
//CHANGE CHRONOMETER TIME BASED ON SEEKBAR POSITION??
pausePlaying();
}
}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//CHANGE MEDIAPLAYER TO PLAY AT CURRENT SEEKBAR POSITION?
startPlaying();
}
});

mPlayButton = (FloatingActionButton) view.findViewById(R.id.fab_play);
mPlayButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onPlay(startPlaying);
startPlaying = !startPlaying;
}
});

builder.setView(view);

return builder.create();
}

@Override
public void onPause() {
super.onPause();

if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}

@Override
public void onDestroy() {
super.onDestroy();
if (mMediaPlayer != null) {
stopPlaying();
}
}

// Play start/stop
private void onPlay(boolean start){
if (start) {
startPlaying();

} else {
pausePlaying();
}
}

private void startPlaying() {
mPlayButton.setImageResource(R.drawable.ic_media_pause);
mCurrentProgress.setBase(SystemClock.elapsedRealtime() + timeWhenPaused);

mCurrentProgress.start();

mMediaPlayer = new MediaPlayer();

try {
mMediaPlayer.setDataSource(item.getFilePath());
mMediaPlayer.prepare();
mSeekBar.setMax(mMediaPlayer.getDuration());
mMediaPlayer.start();

mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
stopPlaying();
}
});

} catch (IOException e) {
Log.e(LOG_TAG, "prepare() failed");
}

mHandler.postDelayed(mRunnable, 0);
}

private void pausePlaying() {
mPlayButton.setImageResource(R.drawable.ic_media_play);
mMediaPlayer.stop();
mCurrentProgress.stop();
timeWhenPaused = mCurrentProgress.getBase() - SystemClock.elapsedRealtime();
}

private void stopPlaying() {
mPlayButton.setImageResource(R.drawable.ic_media_play);
mMediaPlayer.release();
mMediaPlayer = null;
timeWhenPaused = 0;

mCurrentProgress.stop();
}

//updating mSeekBar every second
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
if(mMediaPlayer != null){
int mCurrentPosition = mMediaPlayer.getCurrentPosition();
mSeekBar.setProgress(mCurrentPosition);

mHandler.postDelayed(this, 1000);
}
}
};
}

Aucun commentaire:

Enregistrer un commentaire