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

时间:2011-11-22 08:30:25

标签: android android-mediaplayer

我已经创建了一个歌曲列表,点击了我能够使用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 个答案:

答案 0 :(得分:8)

试试这个:

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

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

答案 1 :(得分: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.

}

答案 2 :(得分: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
            }
        }

    }

答案 3 :(得分:0)

您是打算再次重播玩家,还是玩完玩家?如果您已完成播放器,请调用release()而不是reset()。如果您打算重新使用播放器,请调用reset()而不释放()。

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

答案 4 :(得分:0)

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