有两种方式(同步到异步)可以达到Prepared状态:一旦调用prepare()(同步),一旦方法调用返回,将对象传递到Prepared状态,或者调用prepareAsync()异步),在内部播放器引擎继续处理其余的准备工作直到准备工作完成之前,首先将对象传输到准备状态(这几乎正确地发生)。当准备完成或prepare()调用返回时,如果OnPreparedListener通过setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)事先注册,内部播放器引擎将调用OnPreparedListener接口的onPrepared()的用户提供的回调方法。
重要的是要注意,准备状态是一个暂态,而MediaPlayer对象处于准备状态时调用任何具有副作用的方法的行为是未定义的。
如果在任何其他状态下调用prepare()或prepareAsync()),则抛出IllegalStateException异常。
在Prepared状态下,可以通过调用相应的set方法来调整音频/音量,screenOnWhilePlaying,循环等属性。
在“开始”状态下,如果已经通过setOnBufferingUpdateListener(OnBufferingUpdateListener)事先注册了OnBufferingUpdateListener,则内部播放器引擎将调用用户提供的OnBufferingUpdateListener.onBufferingUpdate()回调方法。此回调允许应用程序在流式传输音频/视频时跟踪缓冲状态。
调用start()对已处于“已启动”状态的MediaPlayer对象没有影响。
调用start()恢复播放暂停的MediaPlayer对象,并且恢复的播放位置与暂停的播放位置相同。当对start()的调用返回时,暂停的MediaPlayer对象将返回到Started状态。
调用pause()对已处于“已暂停”状态的MediaPlayer对象没有影响。
调用stop()停止播放,并使MediaPlayer处于“已启动”,“已暂停”,“准备”或“回放完成”状态,以进入“停止”状态。
一旦处于停止状态,播放无法启动,直到prepare()或prepareAsync()被调用来再次将MediaPlayer对象设置为“准备”状态。
调用stop()对已经处于停止状态的MediaPlayer对象没有影响。
虽然异步的seekTo(int)调用返回正确的方式,实际的查找操作可能需要一段时间才能完成,特别是对于流式传输的音频/视频。当实际搜索操作完成时,如果已经通过setOnSeekCompleteListener(OnSeekCompleteListener)事先注册了OnSeekCompleteListener,则内部播放器引擎将调用用户提供的OnSeekComplete.onSeekComplete()。
请注意,seekTo(int)也可以在其他状态下调用,如Prepared,Paused和PlaybackCompleted状态。
此外,可以通过调用getCurrentPosition()来检索实际的当前播放位置,这有助于诸如需要跟踪播放进度的音乐播放器之类的应用。
当播放达到流的结束时,播放完成。
如果循环模式设置为truewith setLooping(boolean),MediaPlayer对象将保持在“已启动”状态。
如果循环模式设置为false,则如果通过setOnCompletionListener(OnCompletionListener)事先注册了OnCompletionListener,则播放器引擎将调用用户提供的回调方法OnCompletion.onCompletion()。回调的调用表明对象现在处于PlaybackCompleted状态。