1、状态图
音频/视频文件或流媒体的回放控制是以状态机的形式管理的。下面的状态图显示了被回放控制操作支持的MediaPlayer 的生命周期和状态。椭圆形代表MediaPlayer 可以存在的状态,弧线代表推动状态转换的回放控制操作。有两种弧线类型,有单箭头的弧线代表同步的调用方法,双箭头的则代表异步方式。
从这个状态图中, 可以看出一个MedioPlayer有以下几个状态:
1、Idle(空闲)状态:当使用new()方法创建一个MediaPlayer对象或者调用了其reset()方法时,该MediaPlayer对象处于idle状态。
注意:1)一个使用new()方法新建的MediaPlayer对象在Idle状态调用诸如 getCurrentPosition(), getDuration(), getVideoHeight(), getVideoWidth(), setAudioStreamType(int), setLooping(boolean), setVolume(float, float), pause(), start(), stop(), seekTo(int), prepare() 或prepareAsync()的时候不会触发onErrorListener.onError()事件,但是MediaPlayer对象如果在调用reset()方法进入Idle状态后,调用上述方法会触发onErrorListener.onError()事件,并且这个对象将转换为Error状态。
2)当一个MediaPlayer对象不再使用时,最好通过release() 方法释放资源,使其处于End状态。一旦MediaPlayer对象处于End状态,就不能再被使用,且不能通过其他方法使其回到其他状态。
3)调用create方法成功创建的MediaPlayer对象是处于Prepared状态的。
4)在无效状态时调用prepare(),prepareAsync(),或重载setDataSource方法时会抛出IllegalStateException异常。
2、Error状态:为了重新使用错误状态的MediaPlayer对象使它错误状态下恢复,可以呼叫reset()来把这个对象恢复到Idle状态。
3、Initialized状态:调用setDataSource(FileDescriptor), 或setDataSource(String), 或setDataSource (Context, Uri), 或setDataSource(FileDescriptor, long, long)使一个处于Idle状态的MediaPlayer对象切换到Initialized状态。
4、Prepared状态:一个MediaPlayer对象必须先进入Prepared状态才能进入Started状态。
有两种方式(同步和异步)可以使MediaPlayer对象达到Prepared(准备)状态:
1)调用prepare()(同步的)方法,当这个方法返回的时候MediaPlayer对象转换为Prepare状态
2)调用prepareAsync()
(异步)方法,这个方法先使MediaPlayer对象转换为Prepareing状态
5、Started状态:调用start()方法时,MediaPlayer对象进入Started状态,可以用isPlaying()方法来测试MediaPlayer对象是否处于开始状态。
6、当播放到达数据流的终点时,播放完成。如果循环模式通过setLooping(boolean)设为true,那么MediaPlayer对象应该会重新进入Started状态。如被设为false,播放引擎会呼叫用户提供的回放方法OnCompletion.onCompletion(),前提是OncompletionListener先前被SetOnCompletionListener(OnCompletionListener)注册过,此时MediaPlayer对象进入PlaybackCompleted 状态,调用start()方法可以重新使MediaPlayer对象进入Started状态。