我写了一个小型音乐播放控制测试应用程序。我有一个播放,暂停,停止和倒带按钮。我的问题是那个 player.stop(); 行为与...完全相同 player.pause(); 我在player.stop()之后调用player.prepare(),这样我就可以让玩家实例为start()操作做好准备。
在执行stop()之后调用prepare()时,我没有看到任何错误[IOexceptions或IllegalStateExceptions]。另外,我在stop()之后没有调用任何seekTo(0)。所以,我没有把位置设置回歌曲的开头。
我正在使用运行2.3.4的Nexus Google One手机。
任何想法,如果我做一些愚蠢的事情,或者我正在观察的是实际上是如何构建状态机的。
TIA。
答案 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()
。