调用 onStop() 时,MediaPlayer 抛出 IllegalStateException 异常

12

我有一个AlertDialog,当我点击它时会停止播放声音,但在一些设备上,调用onStop()时会抛出IllegalStateException异常,为什么?

如果对话框弹出了,那意味着音频正在播放,所以这应该是音频没有播放的情况。

目前我用try catch包裹了它,但是是什么原因导致了这种情况?

alert.setPositiveButton("YES", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                try{
                mp.stop(); //error
                mp.reset();
                mp.release();
                }catch(Exception e){
                    Log.d("Nitif Activity", e.toString());
                }
                v.cancel();

                popupMessage();                 
                finish();
            }
        });
4个回答

31

检查 mp != null 可以防止 NullPointerException,但这个 IllegalStateException 不可能是由此引起的。

你遇到这个错误的原因是播放器处于一个无法执行 stop() 的状态。如果你看一下 MediaPlayer 文档 顶部的状态图,你会发现只有在播放器处于 Prepared 状态时才能调用 stop。另一个可能性是你已经调用了 release() 或者 reset(),这也会导致该错误。

你只能在 PreparedStartedPausedPlaybackComplete 或者 Stopped 状态下调用 stop()。其他所有状态都会产生该错误。

因此,要么你在做 prepareAsync() 并且用户在你的播放器准备好之前就按下了按钮,要么你的代码在按下按钮之前释放或重置了播放器。


4
我猜你可能在执行这些代码之前已经将实例清空了。 当我遇到这个错误时,我首先检查是否为空。
if (mp != null) {
    try {
        mp.stop(); //error
        mp.reset();
        mp.release();
    } catch(Exception e){
        Log.d("Nitif Activity", e.toString());
    }
}

4
为什么这个回答能被接受,即使它并没有涉及正确类型的异常... @tyczj - Stephen Tetreault
6
为什么“问题”和“回答”是相同的? - Ajit Kumar Dubey
似乎添加了 if(mp != null) - Pierre

0

显然,mp没有被初始化,Dev Resource;

尝试添加:

if(mp != null)

2
这并不合理,因为它在播放之前就被初始化了。我不是说你错了,只是说它没有意义。 - tyczj
@Sam- 我有一个问题,当设备处于静音模式时,但播放器已经启动,然后我调用if (player!= null) {             player.stop();             player.reset();             player.release();             player = null;         }在这种情况下出现了非法异常,请看看为什么会发生这种情况。 - Ajit Kumar Dubey
检查是否为空并不能保证MediaPlayer不处于非法状态。 - srrvnn

0

检查mp!= null可以防止它为空,但是您的mediaplayer永远不会为空。 只需在执行mp.stop()的位置添加mp = null;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接