首页 文章

如何正确停止媒体播放器,android

提问于
浏览
7

我已经创建了一个歌曲列表,点击了我能够使用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();
        }
    }

5 回答

  • 3

    试试这个 :

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

    并且还看看媒体播放器state diagram .

  • 6

    如果你想再次播放,那么使用 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.
    
    }
    
  • 0

    Though the accepted answer works, This is a better way to achieve the task

    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
                }
            }
    
        }
    
  • 0

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

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

  • 8

    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);
        }
    }
    

相关问题