前言:
使用MediaPlayer调用raw文件夹里面的声音。
1.创建MediaPlayer
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.ring);
因为是用这种 MediaPlayer.create 方式创建的,所以不需要调用 prepare 方法。
需要播放声音时:
mediaPlayer.start();
当需要重复播放声音时:
//设置循环播放
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mediaPlayer.start();
}
});
需要暂停播放声音时:
mediaPlayer.pause();
需要停止播放声音时:
mediaPlayer.stop();
当我们首次播放声音时,不需要 prepare ,但是当需要再次播放时,需要先 prepare 才能使用,一般会在 start 之前或者 stop 方法之后调用 prepare 方法。我比较喜欢在 stop 之后调用 prepare方法。
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
有时候我们需要判断声音是否在播放中,当处于播放状态时,停止播放声音,MediaPlayer 提供了 isPlaying 方法来判断是否在播放状态。
mediaPlayer.isPlaying()
但是在使用此方法的时候,经常会出现明明在播放声音,但是 isPlaying 方法返回 false的情况。
这是因为 isPlaying 是异步方法,如果频繁的调用 start 和 stop 方法,就会出现上述问题。
解决办法:
我们自己定义一个 boolean 变量:
private boolean isPlayingRing = false;
在需要使用的时候:
if (isPlayingRing || mediaPlayer.isPlaying()) {
mediaPlayer.stop();
isPlayingRing = false;
try {
mediaPlayer.prepare();
} catch (IOException e) {
e.printStackTrace();
}
}
有时候我们会遇到这类错误
Error (-38, 0)
stop called in state 0
解决方式:
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mediaPlayer.reset();
return true;
}
});
当 MediaPlayer 不使用的时候,需要进行释放,避免内存泄漏,之后 mediaPlayer 的方法都不会在起作用了。一般在 onDestroy 方法中释放。
@Override
protected void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
}
}