一、MediaPlayer的状态
空闲、初始化、正在准备、已经准备、开始、暂停、停止、播放完成、出错、结束。
二、空闲状态
1、在创建对象或者调用对象的reset()方法进入该状态。
2、在该状态下,给对象设置了出错监听,调用对象的以下方法将会回调监听里面的onError()方法:getCurrentPosition()
,getDuration()
,getVideoHeight()
,getVideoWidth()
,setAudioStreamType(int)
,setLooping(boolean)
,setVolume(float, float)
,pause()
,start()
,stop()
,seekTo(int)
,prepare()
orprepareAsync()
;如果对象没有调用reset方法,则状态不发生变化,如果对象调用了reset()方法,则状态回进入出错状态。
三、初始化状态
当对象在空闲状态下,调用了对象的setDataSource()方法进入该状态。
四、正在准备状态
1、 当对象在初始化状态下,调用了对象的prepareAsync()方法进入该状态;
2、当对象在停止状态下,调用了对象的prepareAsync()方法进入该状态。
五、已经准备状态
1、当对象在初始化状态下,调用了对象的prepare()方法进入该状态;
2、对象可以在正在准备状态下,调用对象的onPreparedListener()方法,给该对象设置一个准备监听,当准备完成之后,系统会会调用该监听的onPrepared()方法,从而进入该状态;
3、当对象已经在该状态下,调用了对象的seekTo()方法,状态没有发生改变;
4、当对象在停止状态下,调用了prepare()方法也会进入该状态。
5、使用静态方法create()创建对象时,创建出来的对象就在该状态。
六、开始状态
1、 当对象在已经准备的状态下,调用了对象的start()方法进入该状态;
2、对象已经在该状态下,调用seekTo()方法,或者再次调用了start()方法,状态没有发生改变。
3、当对象已经在该状态下,播放完成之后且Looping设置为true时,状态没有发生改变。
4、当对象在暂停状态下,调用了start()方法进入该状态。
5、当对象在已经播放完成状态下,调用了start()方法进入该状态,音乐从头播放。
6、如果对象已经在开始状态下,多次调用start()方法是没有影响的。
七、暂停状态
1、当对象在开始状态下,调用了pause()方法进入该状态;
2、当对象已经在该状态下,调用了seekTo()方法或者再次调用了pause()方法,状态没有发生改变。
3、当对象已经在暂停状态下,多次调用pause()方法没有影响。
八、停止状态
1、当对象在开始状态下,调用了stop()方法进入该状态;
2、当对象在暂停状态下,调用了stop()方法进入该状态;
3、当对象在准备完成状态下,调用了stop()方法进入该状态。
4、当对象在播放完成状态下,调用了stop()方法进入该状态。
5、当对象在停止状态下,是不能再开始播放了,除非再次调用prepare()或者prepareAsync()方法进入准备状态。
6、当对象在停止状态下,多次调用stop()方法是没有影响的。
九、播放完成状态
1、当对象在开始状态下,一直将音乐播放完成且是否循环播放设置为false进入该状态。
2、已经在该状态下,用户调用了对象的seekTo()方法,状态未发生改变,只是在调用了start()方法后,是从seekTo()设置的位置开始播放。
十、出错状态
1、 给对象设置出错监听onErrorListener(),当回调onError()方法时,进入出错状态。
2、即使没有设置onErrorListener(),当错误发生时,也会进入出错状态。
3、为了能从出错状态恢复,可以调用对象的reset()方法,让该对象进入空闲状态。
4、当对象在没有在初始化状态,停止状态,正在准备状态,或者已经准备状态下,调用了prepare()或者prepareAsync()方法,程序会抛出IllegalStateException异常。
5、如果不是在空闲状态下调用了setDataSource()方法,则程序会抛出IllegalStateException异常。
十一、结束状态
当对象调用了release()方法,进入结束状态。
十二、官网上状态转化图