您的位置:首页 > 其它

MediaPlayerManager

2016-07-17 14:20 337 查看
public class MediaPlayerManager
implements OnBufferingUpdateListener, OnPreparedListener, OnCompletionListener, OnErrorListener {

private final static int MSG_TYPE_PROGRESS_CHANGE = 1;

private static MediaPlayerManager mPlayerManager;
private MediaPlayer mediaPlayer;
private String mMediaPath;
private Timer timer;
private static MediaPlayerManagerListener mMediaPlayerChange;

@SuppressLint("HandlerLeak")
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.arg1) {
case MSG_TYPE_PROGRESS_CHANGE:
Bundle bundle = msg.getData();
int progress = bundle.getInt("progress");
String time = bundle.getString("time");
mMediaPlayerChange.mediaPositionUpdate(progress, time);
break;
default:
break;
}
};
};

public static MediaPlayerManager getInstance(MediaPlayerManagerListener mediaPlayerManagerListener) {
mMediaPlayerChange = mediaPlayerManagerListener;
if (mPlayerManager == null) {
synchronized (MediaPlayerManager.class) {
if (mPlayerManager == null) {
mPlayerManager = new MediaPlayerManager();
}
}
}
return mPlayerManager;
}

private MediaPlayerManager() {
}

// 初始化
public void initMediaPlayer(String mediaPath) {
this.mMediaPath = mediaPath;
mediaPlayer = new MediaPlayer();
if (!TextUtils.isEmpty(mediaPath)) {
setPlayerUrl(mediaPath);
}
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnErrorListener(this);
}

// 开始计时,会返回当前进度和时间值
public void startTimer(final int maxValue) {
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
int position = mediaPlayer.getCurrentPosition();
int duration = mediaPlayer.getDuration();
if (duration > 1) {
// 计算进度(获取进度条最大刻度*当前音乐播放位置 / 当前音乐时长)
long pos = maxValue * position / duration;
Message message = new Message();
message.arg1 = MSG_TYPE_PROGRESS_CHANGE;
Bundle bundle = new Bundle();
bundle.putInt("progress", (int) pos);
bundle.putString("time", getTimeStr(position) + " / " +
getTimeStr(duration));
message.setData(bundle);
handler.sendMessage(message);
}
}
}, 0, 1000);
}

private void setPlayerUrl(String url) {
try {
mediaPlayer.reset();
mediaPlayer.setDataSource(url);// 设置数据源
mediaPlayer.prepare(); // prepare自动播放
} catch (Exception e) {
e.printStackTrace();
}
}

private String getTimeStr(int timeLength) {
int musicTime = timeLength / 1000;
int hour = musicTime / 60;
int minute = musicTime % 60;

String hourStr = hour < 10 ? "0" + hour : "" + hour;
String minuteStr = minute < 10 ? "0" + minute : "" + minute;

return hourStr + ":" + minuteStr;
}

// 释放资源,在onDestroy中调用
public void release() {
if (mediaPlayer != null) {
mediaPlayer.stop();
mediaPlayer.release();
}
timer.cancel();
}

// 是否正在播放
public boolean isPlaying() {
return mediaPlayer.isPlaying();
}

// 暂停
public void pause() {
mediaPlayer.pause();
}

// 开始
public void start() {
mediaPlayer.start();
}

// 获取资源文件的长度
public int getDuration() {
return mediaPlayer.getDuration();
}

public void seekTo(int msec) {
mediaPlayer.seekTo(msec);
}

@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// 出现错误,重新加载
mp.reset();
timer.cancel();
initMediaPlayer(mMediaPath);
return false;
}

@Override
public void onCompletion(MediaPlayer mp) {
// 播放完成
mediaPlayer.seekTo(0);
// playBtn.setImageResource(R.drawable.radio_play);
}

@Override
public void onPrepared(MediaPlayer mp) {
// 准备完成时调用,可做自动播放
// mp.start();
}

@Override
public void onBufferingUpdate(MediaPlayer mp, int percent) {
// 缓冲的处理
// seekBar.setSecondaryProgress(percent);
mMediaPlayerChange.onBufferingUpdate(percent);
}
}


public interface MediaPlayerManagerListener {

//播放过程中的进度
public void mediaPositionUpdate(int progress, String time);

// 缓冲的进度
public void onBufferingUpdate(int percent);
}


调用:

public class RadioPlayActivity extends Activity implements MediaPlayerManagerListener {

private ImageView playBtn;
private SeekBar seekBar;
private TextView timeLengthView;

private MediaPlayerManager playerManager;
private long mLastSeekEventTime = 0;
private int currentProgress = 0;

private String path =
"http://file.kuyinyun.com/group1/M00/90/B7/rBBGdFPXJNeAM-nhABeMElAM6bY151.mp3";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ac_radio_play);
// 初始化View
findView();
initMediaPlayer();

seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
int duration = playerManager.getDuration();
if (mLastSeekEventTime > 250) {
mLastSeekEventTime = 0;
currentProgress = seekBar.getProgress();
}
if (currentProgress > 1) {
long currentPostition = (long) (duration / ((float) seekBar.getMax() / currentProgress));

playerManager.seekTo((int) currentPostition);
} else {
playerManager.seekTo(0);
}
mediaStart();
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
mLastSeekEventTime = 0;
currentProgress = seekBar.getProgress();
mediaPause();
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
long now = SystemClock.elapsedRealtime();
// android 系统默认小于250毫秒,不响应
if ((now - mLastSeekEventTime) > 250) {
mLastSeekEventTime = now;
}
}
});
}

private void findView() {
playBtn = (ImageView) findViewById(R.id.btn_play);
seekBar = (SeekBar) findViewById(R.id.seek_bar);
timeLengthView = (TextView) findViewById(R.id.tv_time_length);

playBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (playerManager.isPlaying()) {
mediaPause();
} else {
mediaStart();
}
}
});
}

private void initMediaPlayer() {
// 初始化MediaPlayer
playerManager = MediaPlayerManager.getInstance(this);
playerManager.initMediaPlayer(path);
playerManager.startTimer(seekBar.getMax());
}

// 暂停
private void mediaPause() {
playerManager.pause();
playBtn.setImageResource(R.drawable.radio_play);
}

// 播放
private void mediaStart() {
playerManager.start();
playBtn.setImageResource(R.drawable.radio_pause);
}

@Override
protected void onStop() {
mediaPause();
super.onStop();
}

@Override
protected void onDestroy() {
playerManager.release();
super.onDestroy();
}

@Override
public void mediaPositionUpdate(int progress, String time) {
seekBar.setProgress(progress);
timeLengthView.setText(time);
}

@Override
public void onBufferingUpdate(int percent) {
// 缓冲的处理
seekBar.setSecondaryProgress(percent);
}
}


ac_radio_play.xml

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/gray"
android:orientation="horizontal" >

<ImageView
android:id="@+id/btn_play"
android:layout_width="35dp"
android:layout_height="35dp"
android:layout_gravity="center_vertical"
android:padding="5dp"
android:src="@drawable/radio_play" />

<SeekBar
android:id="@+id/seek_bar"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:maxHeight="4dp"
android:minHeight="4dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:progressDrawable="@drawable/seek_bar_style"
android:thumb="@drawable/seekbar_select" />

<TextView
android:id="@+id/tv_time_length"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="00:00 / 22:29" />
</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: