MediaPlayer中的IllegalStateException

时间:2016-07-02 08:37:41

标签: java android android-mediaplayer

这是我的代码

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

2 个答案:

答案 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)
}