(图片来自官方文档)
一、当使用new新建一个MediaPlayer对象或调用reset()方法时,MediaPlayer处于Idle状态。当调用release()方法后MediaPlayer处于End状态。
-
使用new操作符新建一个MediaPlayer对象与调用reset()方法之间有一个微小的差异。当MediaPlayer处在Idle状态时调用getCurrentPosition(), getDuration(), getVideoHeight(),getVideoWidth(), setAudioStreamType(int), setLooping(boolean), setVolume(float,float), pause(), start(), stop(), seekTo(int), prepare() or prepareAsync() 这些方法的时候,并且执行这些方法出错时,这个微笑的差异就好会体现出来。如果这些方法是在新建一个MediaPlayer对象之后被立即调用,那么用户提供坚挺错误的回调方法onerror就不会被执行,并且MediaPlayer的状态也不会改变。相反,如果这些方法是在调用reset()方法之后立即调用的,那么当错误发生时监听器就会执行,MediaPlayer的状态也会切换到Error状态
-
一旦MediaPlayer不在使用,应该立即调用release()方法使内部播放引擎释放资源,如果你没有调用release()方法或调用失败就会导致其它应用在创建MediaPlayer对象的时候失败。一旦MediaPlayer对象处于End状态就表示生命周期结束了,不可能在转换为其它的状态。
-
当调用MediaPlayer的create()方法成功时,MediaPlayer处于Prepared状态
二、一般情况下播放控制操作可能因为多种原因而失败,比如不支持的音频格式、分辨率太高、流超时等,因此错误报告和恢复在这些情况下就变得很重要。有时由于编程错误,在一个无效的状态执行播放控制操作也是可能发生的。当这些错误发生时,android的内部播放引擎就会调用开发者提供的OnErrorListener.onError()回调函数
-
即使开发者没有提供OnErrorListener.onError()回调函数,但是当错误发生时,MediaPlayer依然会进入到Error状态。
-
当MediaPlayer处于错误状态的时候可以调用reset()方法是它进入Idle状态,从而可以再次使用MediaPlayer
三、当调用setDataSource()方法成功时,MediaPlayer进入到Initialized状态
-
当在无效状态调用setDataSource()方法时会抛出IllegalStateException异常
四、MediaPlayer必须先进入到Prepared状态,才可以执行播放操作
-
有两种方法进入到Prepared状态,一种调用调用同步方法prepare(),第二种调用异步方法prepareAsync()。一旦MediaPlayer进入到Prepared状态,就会回调onPrepared()方法
-
Preparing状态是一中短暂的状态,当调用异步方法prepareAsync()的时候会处于这种状态,在这种状态下调用MediaPlayer的方法的行为是不可预测的。
-
在其它状态(非Initialized状态)下调用prepare()或prepareAsync()都会产生IllegalStateException异常
-
在Prepared状态下,下面的属性audio/sound volume, screenOnWhilePlaying, looping可以通过适当的方法设置或改变
五、为了启动播放,需要调用start()方法,调用成功后进入到Started状态,之后可以调用isPlaying方法判断MediaPlayer是否处于该状态
-
当MediaPlayer处于Started状态,android内部播放引擎就会回调onBufferingUpdate()方法,这个方法使用setOnBufferingUpdateListener(OnBufferingUpdateListener)方法进行注册。onBufferingUpdate()为应用程序提供了跟踪缓冲状态的机制
-
当MediaPlayer处于Started状态,在调用start()方法没有任何影响
六、调用pause()方法暂停播放,此时处于Paused状态,在次状态下调用pause()方法没有任何的影响,当调用start()方法时恢复播放,且是从被暂停的位置恢复
七、 在Paused, Prepared or PlaybackCompleted状态下调用stop()方法,会使MediaPlayer进入到Stopped状态,一旦进入到Stopped状态只能调用prepare() or prepareAsync()方法进入到Prepared状态
八、在Prepared, Paused and PlaybackCompleted状态下调用seekTo()方法可以设置播放的位置,调用getCurrentPosition()方法可以获取当前的播放位置
八、当播放完成时
-
如果looping为true,那么再次进入Started状态,循环播放
-
如果looping为false,那么android的播放引擎就会回调OnCompletion.onCompletion()方法,此时MediaPlayer处于PlaybackCompleted状态