// 设置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);
}
});