【问题标题】:MediaPlayer throwing IllegalStateException when calling onStop()MediaPlayer 在调用 onStop() 时抛出 IllegalStateException
【发布时间】:2012-05-04 17:46:51
【问题描述】:

我有一个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();
            }
        });

【问题讨论】:

    标签: android android-mediaplayer


    【解决方案1】:

    检查mp != null 可以防止NullPointerExceptionIllegalStateException 不能由此引起。

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

    您只能在PreparedStartedPausedPlaybackCompleteStopped 状态下调用stop()。所有其他州都会产生该错误。

    因此,您要么执行prepareAsync(),并且用户在您的播放器准备好之前点击按钮,要么您有代码在您点击按钮之前释放或重置播放器。

    【讨论】:

      【解决方案2】:

      我猜您可能会在执行这些行之前将您的实例清空。 当我收到此错误时,我首先检查 null。

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

      【讨论】:

      • 为什么当它甚至没有解决正确类型的异常时这是公认的答案...@tyczj
      • @Deepak-question and answer is the same 为什么?
      • if(mp != null) 似乎已添加
      【解决方案3】:

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

      尝试添加:

      if(mp != null)
      

      【讨论】:

      • 这并不意味着它不会被初始化,因为它在播放之前就被初始化了。不是说你错了只是说它没有意义
      • @Sam- 当设备处于静音模式但播放器已经启动时我有一个问题,然后我调用 if (player != null) { player.stop();播放器.reset();播放器.release();玩家=空; } 在这种情况下得到了非法异常,请看看为什么会发生
      • 检查 null 并不能保证 MediaPlayer 不处于非法状态。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        相关资源
        最近更新 更多