// 設置uri
if (!TextUtils.isEmpty(url)) {
mSwitchIv.setSelected(false);
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
mMediaPlayer = new MediaPlayer(TelecastPlayActivity.this);
// 設置監聽器
mMediaPlayer.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// 緩衝狀態中,percent爲下載量的百分比,一般在videoView中間設置
mPercent = percent;
}
});
mMediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mSwitchIv.setSelected(false);
}
});
mMediaPlayer.setOnInfoListener(new MediaInfoListener());
// mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
// @Override
// public void onPrepared(MediaPlayer mediaPlayer) {
// mediaPlayer.setPlaybackSpeed(1.0f);
// mediaPlayer.start();
// mSwitchIv.setSelected(true);
// show(sDefaultTimeout);
// }
// });
Uri uri = Uri.parse(url);
try {
mMediaPlayer.setDataSource(TelecastPlayActivity.this, uri);
mMediaPlayer.prepare();
mMediaPlayer.start();
mSwitchIv.setSelected(true);
show(sDefaultTimeout);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果需求可以切換音頻,需要先施放,重新new新的MediaPlayer,並且不能使用異步準備
show(sDefaultTimeout)就是用一個handler不停的刷新刷新進度條:
public void show(int timeout) {
mHandler.sendEmptyMessage(SHOW_PROGRESS);
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
long pos;
switch (msg.what) {
case SHOW_PROGRESS:
pos = setProgress();
msg = obtainMessage(SHOW_PROGRESS);
sendMessageDelayed(msg, 1000 - (pos % 1000));
break;
}
}
};
setProgress()就是設置進度條百分比:
private long setProgress() {
long position = mMediaPlayer.getCurrentPosition();
long duration = mMediaPlayer.getDuration();
if (mSeekBar != null) {
if (duration > 0) {
long pos = 1000L * position / duration;
mSeekBar.setProgress((int) pos);
}
int percent = mPercent;
//
mSeekBar.setSecondaryProgress(percent * 10);
}
mDuration = duration;
return position;
}
以上在音頻播放時控制了進度條的更新,同時seekbar被手指拖動時要響應MediaPlayer的進度:
mSeekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
//mDuration爲進度條的總長度,seekBar.getProgress()獲得的是百分比,/ 1000後就是0.幾,然後再乘以總長度就設置了mMediaPlayer需要播放的進度
mMediaPlayer.seekTo((mDuration * seekBar.getProgress()) / 1000);
show(sDefaultTimeout);
mHandler.removeMessages(SHOW_PROGRESS);
// mAM.setStreamMute(AudioManager.STREAM_MUSIC, false);
mHandler.sendEmptyMessageDelayed(SHOW_PROGRESS, 1000);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (!fromUser)
return;
long newposition = (mDuration * progress) / 1000;
mMediaPlayer.seekTo(newposition);
}
});