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>
相关文章推荐
- Android Studio 构建项目一直卡在 gradle build running 解决方法
- [暑假集训] jzoj 2016.7.17 noip模拟赛C&B 总结
- genymotion 启动模拟器"unable to start the virtual device"问题解决
- gulp + browserSync 一起提高前端开发效率吧!
- jzoj 1365. 【队列练习】奇怪的电梯
- 深入浅出 RecyclerView
- css3学习以及移动端开发基本概念的思考
- hihocoder-平衡树·SBT
- 利用 libevent 实现简单 http client GET、POST
- handler浅谈
- HTML iframe 用法小总结
- linux系统中怎么结束boa进程?
- gcc选项 -D_REENTRANT机制
- 晃动动画加震动
- jzoj 1591. 【普及模拟】游戏
- listView分页加载
- 根据观测时间,经纬度,求太阳高度角
- win7 vi工具
- cccc
- java文件及读写操作