MediaPlayer状态机

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()可能需要一点时间来等待状态的更新。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值