本文转自: Android Multimedia框架总结(一)MediaPlayer介绍之状态图及生命周期
前言:
从本篇开始,将进入Multimedia框架,包含MediaPlayer, Camera, Surface, MediaRecord, 接下来几篇都是MediaPlayer相关。
同样看下Agenda如下:
(1):MediaPlayer的状态图
(2):Idle 状态
(3):End 状态
(4):Error 状态
(5):Initialized状态
(6):Prepared状态
(7):Preparing状态
(8):Started状态
(9):Paused状态
(10):Stopped状态
(11):PlaybackCompleted状态
MediaPlayer介绍
MediaPlayer类是用于控制playback的视频/音频文件 及 流。
主要覆盖如下以下方面:
(1) 状态图
(2) 有效状态及无效状态
(3) 权限
(4) 回调方法
MediaPlayer的状态图
playback控制视频/音频文件及流是被状态机进行管理。
下图显示MediaPlayer生命周期以及由playback控制操作所影响。
椭圆代表MediaPlayer驻留的状态
弧代表playback控制且驱动MediaPlayer状态进行过渡。
有两种类型的弧,一种是用单箭头表示的是同步方法调用,另一种有两个箭头代表异步方法调用
从状态图中,我们能看到MediaPlayer有如下一些状态:
Idle 状态及End 状态
当MediaPlayer 用 new 或者在 reset 方法调用后,就被创建了, 这个时候它是处于Idle (就绪)状态,
当 releasel 方法被调用后,它就属于 End(结束状态),
这两种下状态之间,就是 MediaPlayer的生命周期。
Error 状态
-
有一种微妙的 但 又非常重要的时刻
当构造 一个新的 MediaPlayer 或者 reset() 方法被调和后。
在这两种情况下,应用程序调用getCurrentPosition,getVideoHeight(),getDuration(),getVideoWidth(),setAudioStramType(int),
setLooping(boolem),setVolume(float, float),pause(),start(), stop(), seekTo(int), prepare(), prepareAsync(),
这些方法在Idle(就绪状态) 时有可能出错。如果这些方法在MediaPlayer 被构造后,调用正确的话,用户提供回调函数方法 OnErrorListener.onError() 将不会调用在player内部,
MediaPlayer的状态也不会变化,但是这些方法如果是在reset 方法如果是在reset 方法调用后,再调用时,用户提供的回调方法OnErrorListener.onError() 将传递MediaPlayer 到 Error (错误)的状态,
所以,也推荐一旦MediaPlayer 不再使用时,马上调用下release 方法, 以便 MediaPlayer 资源得到释放, 这些资源也许包含一些单例。
如硬的加速组件和失败去调用release 也许引起后续 MediaPlayer 实例回退到软件非播放页或退出。 -
一旦MediaPlayer 是End 结束状时,它将不再能被使用,没有任何办法带它回到MediaPlayer的其它状态。
生命周期已经终止。
进一步说,当MediaPlay 使用NEW 创建后,变成Idle 就绪状态时,同时这些创建 重载创建create 方法,不是Idle 就绪状态。
事实上,如果创建时使用create 方法成功的话,这些已经是Prepared(准备好)状态。 -
总的来说,一些Playback 的控制操件也许会失败,由于各种原因,如不支持的音频格式,糟糕的音视频交错,分辨率过高,流超时,等等。
因此,在这种情况下,错误报告并覆盖相关问题是非常重要的。 有时,由于程序错误,调用playback 控制操作也许会变得无效。
在这种错误的条件下,如果事先,用户通过setOnErrorListener 注册过 OnErrorListener ,这时player 内部诘用 OnErrorListener.OnError() 回调方法, 将会把错误信息返回了去。一旦发生错误,MediaPlayer就会进入Error状态,
为了重新利用Mediaplayer, 在Error 状态时,调用reset 方法将重新恢复到 Idle 就绪状态,
所以让自已的MediaPlayer注册OnErrorListener 是一个好的编程习惯, 可以从Player 内部返回来的信息帮你找到错误。 -
调用prepare 方法,或者 prepareAsync 方法,或者 重载setDataResource 方法。 抛出IllegalStateExceprion 为防止程序错误。