【问题标题】:IllegalStateException in MediaPlayerMediaPlayer 中的 IllegalStateException
【发布时间】:2016-07-02 08:37:40
【问题描述】:

这是我的代码

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 的生命周期感到非常困惑。

这是适配器中的一个函数,它从另一个 ActivityonBackPressed() 函数调用。 player 是一个类变量。

我在同一个文件中发布这个MediaPlayer

public void onClick(View v) {
    try {
        if (player != null) {
            player.stop();
            player.release();
        }
    } catch (Exception e) {
    }
    player = MediaPlayer.create(activityContext, soundId);
    player.start();
}

【问题讨论】:

  • 播放器好像最近发布了。方法 isPlaying() 仅在调用 start() 后返回 true。在调用抛出 IllegalStateException 的 player.isPlaying() 之前,检查您是否在代码中调用了 .reset() 或 .release()。

标签: java android android-mediaplayer


【解决方案1】:

问题是您没有跟踪 MediaPlayer 实例的状态。

在调用isPlaying() 之前,您只执行null 值检查,尽管player 仍然可以被释放(但不是null)。

在已发布的MediaPlayer 实例上调用isPlaying() 将导致IllegalStateException

为避免这种情况,您可以在发布时将 player 设置为 null

player.release();
player = null;

或者您可以使用boolean 标志来跟踪其状态:

boolean isReleased;

// ...

player.release();
isReleased = true;

所以你可以在必要时检查这个标志:

if (player != null && !isReleased) {
    if(player.isPlaying()) {
        // ...
    }
}

(不要忘记在适当的时候将其设置为false

【讨论】:

  • 非常漂亮和简单!
【解决方案2】:

添加到 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)
}

【讨论】:

  • 拯救我的世界\o/
  • :) @icaro 很高兴听到这个消息。
猜你喜欢
  • 1970-01-01
  • 2018-12-08
  • 2017-01-02
  • 1970-01-01
  • 2017-02-12
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多