【问题标题】:How to stop media player properly , android如何正确停止媒体播放器,android
【发布时间】:2011-11-22 08:30:25
【问题描述】:

我已经创建了一个歌曲列表,点击歌曲我可以使用 MedaiPlayer 播放歌曲。如果用户单击另一首歌曲正在播放一首歌曲,那么我将停止媒体播放器并再次启动播放器。但是我在 reset() 中遇到了非法状态异常。这是我得到异常的代码。如何正确阻止玩家?还有为什么我会得到这个例外。如何避免?

public void stopPlayer() {
        try {
            if (player != null) {
                // Log.e("Trying to Stop "," Player ");
                player.stop();
                player.release();

                player.reset();// causes IllegalstateException

                player = null;

            }

        } catch (Exception e) {
            player = null;
            playerStatus = false;
            e.printStackTrace();
        }
    }

【问题讨论】:

  • player.release() 导致释放 MediaPlayer 对象,因此您无法在之后重置它,因为您没有对象来重置它。

标签: android android-mediaplayer


【解决方案1】:

试试这个:

player.reset();
player.release();

还可以看看媒体播放器state diagram

【讨论】:

  • 我遇到了一些问题,在 finally 块下按此顺序使用这些方法解决了它们。谢谢。
【解决方案2】:

如果你想再玩一次,请使用player.reset()player.release() 表示它释放了播放器对象,因此您必须重新初始化播放器。所以首先你使用reset() 然后release()release() 在您的播放器对象不再工作时使用。当您的活动破坏 release() 方法以用于良好实践时。

只要你想停止它:

if(player!=null)
{
   if(player.isPlaying())
      player.stop();

   player.reset();//It requires again setDataSource for player object.

}

当您的播放器不再需要时:

if(player!=null)
{
   if(player.isPlaying())
      player.stop();

   player.reset();//It requires again setDataSource for player object.
   player.release();
   player=null; // fixed typo.

}

【讨论】:

    【解决方案3】:

    虽然接受的答案有效,但这是完成任务的更好方法

    private void stopSong() {
    
            if(mediaPlayer!=null) {
                if(mediaPlayer.isPlaying()) {
                    mediaPlayer.reset();// It requires again setDataSource for player object.
                    mediaPlayer.stop();// Stop it
                    mediaPlayer.release();// Release it
                    mediaPlayer = null; // Initialize it to null so it can be used later
                }
            }
    
        }
    

    【讨论】:

    • mediaPlayer = null 我觉得没用
    【解决方案4】:

    您是否打算再次使用播放器,或者您是否已完成播放器?如果您完成了播放器,请调用 release() 而不是 reset()。如果您打算重用播放器,请调用 reset() 而不是 release()。

    reset() 将播放器重置为未初始化状态。 release() 释放所有与播放器相关的资源。

    【讨论】:

      【解决方案5】:

      Media Player State Diagram 显示并声明:

      调用 stop() 会停止播放并导致处于 Started、Paused、Prepared 或 PlaybackCompleted 状态的 MediaPlayer 进入 Stopped 状态。

      • 一旦处于 Stopped 状态,在调用 prepare() 或 prepareAsync() 将 MediaPlayer 对象再次设置为 Prepared 状态之前,无法开始播放。

      这意味着,在调用 stop() 之后,如果我们想再次播放相同的音频文件,我们应该调用 prepare()。否则再次调用 start() 将无济于事。

      由于 prepare() 可能会抛出异常,我们应该将其包装在 try-catch 块中,如下所示:

          public void stopAudio(View view) {
          mplayer.stop();
          try {
              mplayer.prepare();
          } catch (IOException e) {
              Log.e("stopAudio", "Unable to prepare() mplayer after stop()", e);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        相关资源
        最近更新 更多