MediaPlayer是Android中用来播放媒体文件的一个类,我们用其来播放音乐文件,先介绍用法。
首先MediaPlayer需要实例化对象,我们在onStratCommand中进行实例化。
private MediaPlayer player;
// api2.0以后采用onStartCommand
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("music service", "onstartcommand");
player = new MediaPlayer();
mp3Infos = intent.getParcelableArrayListExtra("mp3Infos");
return super.onStartCommand(intent, flags, startId);
}
音乐总有开始播放,和播放完毕的时候,我们需要继承两个接口OnPreparedListener,OnCompletionListener,并且实现接口的回调方法。
/**
* 音乐准备完成的回调函数
*/
@Override
public void onPrepared(MediaPlayer arg0) {
Log.i("music service", "onprepare");
player.start();
}
/**
* 音乐播放完成的回调函数
*/
@Override
public void onCompletion(MediaPlayer arg0) {
Log.i("music service", "oncompletion");
if ((Myapp.state % 3) == 2) {
prepareMusic(position);
} else {
Intent intent = new Intent();
intent.setAction(Constants.ACTION_NEXT);
sendBroadcast(intent);
}
}
其中的prepareMusic是将播放音乐的过程抽象出来的方法
<span style="font-size:14px;">/*
* 准备播放音乐并添加播放与完结的事件监听
*/
private void prepareMusic(int position) {
player.reset();
player.setAudioStreamType(AudioManager.STREAM_MUSIC); // 设置播放类型
String url = mp3Infos.get(position).getUrl();
try {
player.setDataSource(url);
} catch (Exception e) {
e.printStackTrace();
}
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.prepareAsync(); // prepare是阻塞的 prepareAsync是异步的
}</span>
当然音乐也需要暂停功能
public void pauseMusic() {
Log.i("pause", "pause");
player.pause();
current = player.getCurrentPosition();
}
这里的current是返回的暂停时的milliseconds,可以看源码了解
当继续播放的时候,我们设置当前播放进度为current,然后start就可以了
player.seekTo(current);
player.start();