现在的位置: 首页 > 综合 > 正文

MediaPlayer状态机

2018年02月10日 ⁄ 综合 ⁄ 共 2120字 ⁄ 字号 评论关闭

MediaPlayer为Android SDK提供的用于控制音乐视频和流媒体播放的类。MediaPlayer内部的状态机如下:

当新创建一个MediaPlayer对象或者调用了一个MediaPlayer对象的reset()方法,这个MediaPlayer的状态为Idle state。当调用了release()方法之后,状态变为End state。MediaPlayer对象的生命周期就介于这两个状态之间。

 

虽然新建一个MediaPlayer对象和调用一个MediaPlayer对象爱你个的reset()方法之后,MediaPlayer的状态都是Idle state,但是这两者之间还是有微妙的区别。

1.以上两种情况下调用getCurrentPosition(),
getDuration(),
getVideoHeight(),
getVideoWidth(),
setAudioStreamType(int),
setLooping(boolean),
setVolume(float, float),
pause(),
start(),
stop(),
seekTo(int),
prepare()
prepareAsync(),都会产生编程错误。但是,如果new了一个MediaPlayer对象之后立马调用提到的函数,用户注册的OnErrorListener中的onError函数不会被调用,并且播放引擎的状态还是保持不变。如果是后者,用户提供的callback 
OnErrorListener.onError()将会被调用,并且播放引擎的内部状态会变成Error状态。

2.强烈建议一旦MediaPlayer不再使用了,立即调用release()方法释放与这个MediaPlayer相关联的资源。这些资源可能包括单例资源,比如硬件加速器。一旦MediaPlayer状态变为End state,就再也没有办法变为其他的状态。

3.此外,采用一些列的重载函数create创建的MediaPlayer不是位于Idle state。实际上,如果创建成功了的话,MediaPlayer对象的状态为Prepared state。

在实际的播放过程中,可能会发生错误。如果用户通过setOnErrorListener(android.media.MediaPlayer.OnErrorListener)注册了callback函数,那么在发生错误的时候就会通知用户。如果MediaPlayer发生了错误,其状态会变为Error
state。可以通过调用reset()函数恢复到Idle state状态。在调用prepare(),
prepareAsync()或者在无效的状态下调用setDataSource函数的时候,会抛出IllegalStateException异常。

成功的调用setDataSource函数会使MediaPlayer的状态由Idle state 变为
Initialized state。

在开始播放之前,MediaPlayer必须进入到Prepared state:

1.调用prepare()或者prepareAsync()方法.当调用prepareAsync之后,MediaPlayer对象的状态变为Preparing
state,然后立刻返回,播放引擎的工作还在后台继续处理,当处理完毕或者prepare函数调用完毕,其状态都会变成Prepared state。并且,如果用户通过setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)
注册了OnPreparedListener接口,那么onPrepared()的callback会被调用。

2.Preparing state是一个中间状态,在此期间调用其他的方法后果是未知的。

3.在非Idle状态下调用  prepare() 或者
prepareAsync()都会抛出IllegalStateException异常。

4.当在Prepared state状态,可以通过设置函数的调用,调整属性值,比如音量,在播放的时候不锁屏,循环播放等。

当成功的调用了start()函数之后,MediaPlayer对象就进入了Started state。可以调用isPlaying()函数测试是否位于Started state。

1.通过调用setOnBufferingUpdateListener(OnBufferingUpdateListener)注册OnBufferingUpdateListener,可以监视流媒体buffer的状态;

2.当已经处于Started state时候,再次调用start()函数,没有什么作用。

当播放处于paused或者 stopped,可以调整播放的位置。当调用pause()函数,播放器停止播放。当pause()函数调用返回的时候,MediaPlayer对象的状态变为Paused state。注意当从Started
state 变为Paused state(反之亦然),播放引擎的状态变化是异步的。所以调用isPlaying()可能需要一点时间来等待状态的更新。

抱歉!评论已关闭.