调用onStop()时MediaPlayer抛出IllegalStateException

时间:2012-05-04 17:46:52

标签: android android-mediaplayer

我有一个AlertDialog,点击后停止播放声音,但在某些设备上,调用onStop()会显示IllegalStateException,但为什么?

如果对话框已启动,则表示正在播放声音,因此应该是音频未播放的情况。

我现在试着用它来包围它,但是这会导致什么呢?

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 个答案:

答案 0 :(得分:22)

检查mp != null会阻止NullPointerException,但IllegalStateException不会导致stop()

您收到该错误的原因是播放器处于无法Prepared的状态。如果您查看MediaPlayer documentation顶部的状态图,您可以看到只有在玩家处于release()状态后才能调用停止。下一个可能性是您已经调用了reset()stop(),这也会导致错误。

您只能在PreparedStartedPausedPlaybackCompleteStopped州致电prepareAsync()。所有其他州都会产生这种错误。

所以你要么做{{1}}并且用户在你的玩家准备好之前点击按钮,或者你有代码在你按下按钮之前释放或重置玩家。

答案 1 :(得分:2)

显然mp未初始化,Dev Resource;

尝试添加:

if(mp != null)

答案 2 :(得分:1)

我猜你可能会在执行这些行之前释放你的媒体播放器。当我得到这个错误时,我喜欢这样,希望这可以解决你的问题...

if(mp != null) {
try{
      mp.stop(); //error
      mp.reset();
      mp.release();
   }catch(Exception e){
       Log.d("Nitif Activity", e.toString());
       }
}

答案 3 :(得分:-1)

检查mp!= null会阻止它为null,但您的媒体播放器永远不会为空。 只需添加mp = null;你在哪里做mp.stop();