MediaPlayer生命周期:
注:1.prepare会造成阻塞 要先缓存一段后才会播放
2.调用stop()方法后,在调用star()会出现状态错误。可用以下方法替代解决:
// 停止播放 private void stop() { // mPlayer.stop(); // 用下面的方法替代stop方法 mPlayer.pause(); mPlayer.seekTo(0); sendPlayBroadcast(); }
范例:
public class MediaPlayerServeice extends Service { private MediaPlayer mPlayer; private SongJson songJson; private ArrayList<SongJson> mPlayList = new ArrayList<SongJson>();//播放列表 private ArrayList<SongJson> mRadomPlayList = new ArrayList<SongJson>();//随机播放列表 private int mPlayMode;//播放模式 private SongJson mPlayingSong;//当前播放歌曲 private int mSongPosition;//当前播放歌曲在列表中的位置 public MediaPlayerServeice() { } @Override public void onCreate() { super.onCreate(); mPlayingSong = new SongJson(); mPlayer = new MediaPlayer(); mBinder = new PlayBinder(); //出现状态错误时,此方法规避fc mPlayer.setOnErrorListener(new OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { mPlayer.reset(); return false; } }); //监听音乐是否播放完毕 mPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { playNext(); } }); } private IBinder mBinder; @Override public IBinder onBind(Intent intent) { return mBinder; } //快进快退 private void seekTo(int msec) { // mPlayer.getDuration();//得到歌曲总时间 mPlayer.seekTo(msec); } //得到当前播放位置 public int getCurrentPosition() { return mPlayer.getCurrentPosition(); } //播放下一首 private void playNext() { } //停止播放 private void stop() { mPlayer.stop(); } //得到播放循环模式 private int setPlayMode(int mode) { return mPlayMode = mode; } //添加歌曲至播放列表 private void setPlayList(ArrayList<SongJson> list) { } // 得到当前播放进度 private int getCurrTime() { return mPlayer.getCurrentPosition(); } //继续播放 private void continuePlay() { mPlayer.start(); } //是否正在播放 private boolean isplaying() { return mPlayer.isPlaying(); } //暂停 private void pause() { mPlayer.pause(); } // 播放音乐 private void play(final String url) { mPlayer.reset(); try { mPlayer.setDataSource(url); mPlayer.setOnPreparedListener(new OnPreparedListener() { @Override public void onPrepared(MediaPlayer mp) { mPlayer.start(); } }); mPlayer.prepareAsync(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } // 自定义Binder public class PlayBinder extends Binder { public void play(String url) { MediaPlayerServeice.this.play(url); } public boolean isplaying() { return MediaPlayerServeice.this.isplaying(); } public void pause() { MediaPlayerServeice.this.pause(); } public void continuePlay() { MediaPlayerServeice.this.continuePlay(); } public int getCurrTime() { return MediaPlayerServeice.this.getCurrTime(); } public void setPlayList(ArrayList<SongJson> list) { MediaPlayerServeice.this.setPlayList(list); } public int setPlayMode(int mode) { return MediaPlayerServeice.this.setPlayMode(mode); } public void playNext() { MediaPlayerServeice.this.playNext(); } public void stop() { MediaPlayerServeice.this.stop(); } public int getCurrentPosition() { return MediaPlayerServeice.this.getCurrentPosition(); } } }
参考资料:
1.Android媒体的一些使用总结
http://blog.csdn.net/chengfuyong001/article/details/8617395
http://blog.csdn.net/xingtian713/article/details/6525411