MediaPlayer实例:stop表现得像一个暂停

时间:2011-07-27 18:03:41

标签: android media-player

我写了一个小型音乐播放控制测试应用程序。我有一个播放,暂停,停止和倒带按钮。我的问题是那个      player.stop(); 行为与...完全相同      player.pause(); 我在player.stop()之后调用player.prepare(),这样我就可以让玩家实例为start()操作做好准备。

在执行stop()之后调用prepare()时,我没有看到任何错误[IOexceptions或IllegalStateExceptions]。另外,我在stop()之后没有调用任何seekTo(0)。所以,我没有把位置设置回歌曲的开头。

我正在使用运行2.3.4的Nexus Google One手机。

任何想法,如果我做一些愚蠢的事情,或者我正在观察的是实际上是如何构建状态机的。

TIA。

2 个答案:

答案 0 :(得分:3)

我认为这可能是一个错误,因为MediaPlayer启动方法的API文档会显示您期望的行为:

  

public void start()

     

开始或恢复播放。如果先前已暂停播放,   播放将从暂停的位置继续播放。如果回放了   停止,或从未开始,播放将从开始   开始。

目前,一旦准备好玩家,明确地调用seekTo(0)似乎是一个合理的解决方法。

答案 1 :(得分:2)

不是状态图http://developer.android.com/reference/android/media/MediaPlayer.html 说停止意味着“保持停止状态”?

  

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

     

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

没有确认stop()应该更改CurrentPosition

没有确认调用prepare()应该更改CurrentPosition

所以,要想到音乐的开头,你应该设定它的位置。

但我同意你的看法。由于pause()方法声明它将从当前位置继续播放,因此我希望它会在调用stop()时返回到开头。

当您需要致电prepare()

时,它会产生一些影响
  

例如,对prepare()的调用可能需要很长时间才能执行,因为它可能涉及获取和解码媒体数据。

所以stop()需要致电prepare()这可能会花费更长时间,而pause()影响较小:您可以立即致电start()