这是我的代码
if (player != null) {
if(player.isPlaying()){
player.pause();
player.stop();
}
player.release();
}
这是错误
FATAL EXCEPTION: main
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.mindefy.sindhipathshala.RecViewAdapter.mediafileRelease(RecViewAdapter.java:234)
at com.mindefy.sindhipathshala.SectionFruits.onBackPressed(SectionFruits.java:252)
我是Android的初学者,我对MediaPlayer
的生命周期非常困惑。
这是从另一个onBackPressed()
的{{1}}函数调用的适配器中的函数。 Activity
是一个类变量。
我将此player
发布在与
MediaPlayer
答案 0 :(得分:9)
问题是您没有跟踪MediaPlayer
实例的状态。
在致电isPlaying()
之前,您只需执行null
价值检查,但仍可以发布player
(但不能null
)。
在已发布的isPlaying()
个实例上调用MediaPlayer
会产生IllegalStateException
。
为避免这种情况,您可以在释放时将player
设置为null
:
player.release();
player = null;
或者您可以使用boolean
标志来跟踪其状态:
boolean isReleased;
// ...
player.release();
isReleased = true;
所以你可以在必要时检查这个标志:
if (player != null && !isReleased) {
if(player.isPlaying()) {
// ...
}
}
(不要忘记在适当时将其设置为false
答案 1 :(得分:0)
添加到earthW0rmjim:我遇到了同样的问题(由于非法状态异常,一些音频没有重现)。我发现我在回调中重置了我的音频对象。所以,我在重置我的对象之前设置了player.setDataSource(url),因为回调是在之后进行的。我的解决方案:setDataSource和prepareAsync的try / catch块上的player.reset()。
try {
player.reset(); //Important line
player.setDataSource(url);
player.prepareAsync();
} catch (Exception e) {
Log.e(Constants.AUDIO_LOG_TAG, "Error playing file " + url, e);
}
看看回调:
public void finishedPlayback(){
player.reset(); //Executing after the try / catch (sometimes)
}