Android MediaPlayer实例:停止的行为类似于暂停

Android MediaPlayer实例:停止的行为类似于暂停,android,media-player,Android,Media Player,我写了一个小的音乐播放控制测试应用程序。我有一个播放、暂停、停止和回放按钮。我的问题是 player.stop(); 其行为方式与 player.pause(); 我在player.stop()之后调用player.prepare(),以便让player实例为start()操作做好准备 在我停止()之后调用prepare()时,我没有看到引发任何错误[IOexceptions或IllegalStateExceptions]。此外,我不会在stop()之后调用任何seekTo(0)。因此,我不会将

我写了一个小的音乐播放控制测试应用程序。我有一个播放、暂停、停止和回放按钮。我的问题是 player.stop(); 其行为方式与 player.pause(); 我在player.stop()之后调用player.prepare(),以便让player实例为start()操作做好准备

在我停止()之后调用prepare()时,我没有看到引发任何错误[IOexceptions或IllegalStateExceptions]。此外,我不会在stop()之后调用任何seekTo(0)。因此,我不会将位置设置回歌曲的开头

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

如果我正在做一些愚蠢的事情,或者我正在观察的是状态机是如何构建的,那么你知道吗

TIA。

状态图中没有 停止表示“保持在停止状态”的状态

调用stop()停止播放,并使处于已启动、已暂停、已准备或已播放完成状态的MediaPlayer进入停止状态

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

没有确认
stop()
应更改
当前位置

不能肯定调用
prepare()
会改变
CurrentPosition

因此,要进入音乐的开头,你应该手动设置它的位置

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

当您需要调用
prepare()

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


因此,
stop()
需要调用
prepare()
,这样会花费更长的时间,而
pause()
的影响较小:您可以在之后立即调用
start()

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

公共无效开始()

开始或恢复播放。如果先前已暂停播放, 播放将从暂停的位置继续。如果播放已经完成 已停止或以前从未开始播放,播放将在 开始


目前,在播放器准备好后显式调用seekTo(0)似乎是一个合理的解决方法。

问题是,当您从停止状态转到准备状态,然后调用start(),我们希望歌曲从开始还是从播放器停止的位置开始。我觉得应该从头开始,但我观察到它是从停止的点开始的。所以,它让我觉得stop()和pause()之间没有区别。如果我错了,请纠正我。这是我期望它的表现,但是。。。看看
stop
不会使它转到另一个位置(没有任何迹象表明它会转到)。getCurrentPosition()甚至可以在停止状态下工作。hhmm。。。我希望处于停止状态的getCurrentPosition()返回0。那么,pause()和pause()有什么区别呢?然后停止()?为什么有两个基本上功能相同的状态。同意在暂停()后不需要调用prepare()。但从用户的角度来看,这两种状态没有区别。谢谢,小沃利维拉,谢谢。现在,我将在以下时间之后通过seekTo()手动重置位置:因此,序列将是stop()-->prepare()-->seekTo(0),这将满足我的需要:)嗨!我也尝试过这个序列,它也能工作,但当我再次点击播放时,我听到了一点音乐,然后它才找到0的位置。。。为什么?你问这些问题已经三年了,我的怀疑也是一样的。我只是想检查一下他们是否已经更新了api,这样在停止之后它就可以开始了?@user3726986请查看我在“接受”答案的帖子中的评论。那是在2011年。它应该仍然有效。