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
转载于:https://blog.51cto.com/glblong/1248371