android MediaPlayer详解

(图片来自官方文档)

一、当使用new新建一个MediaPlayer对象或调用reset()方法时,MediaPlayer处于Idle状态。当调用release()方法后MediaPlayer处于End状态。

  1. 使用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状态

  2. 一旦MediaPlayer不在使用,应该立即调用release()方法使内部播放引擎释放资源,如果你没有调用release()方法或调用失败就会导致其它应用在创建MediaPlayer对象的时候失败。一旦MediaPlayer对象处于End状态就表示生命周期结束了,不可能在转换为其它的状态。

  3. 当调用MediaPlayercreate()方法成功时,MediaPlayer处于Prepared状态 

二、一般情况下播放控制操作可能因为多种原因而失败,比如不支持的音频格式、分辨率太高、流超时等,因此错误报告和恢复在这些情况下就变得很重要。有时由于编程错误,在一个无效的状态执行播放控制操作也是可能发生的。当这些错误发生时,android的内部播放引擎就会调用开发者提供的OnErrorListener.onError()回调函数


  1. 即使开发者没有提供OnErrorListener.onError()回调函数,但是当错误发生时,MediaPlayer依然会进入到Error状态。

  2. MediaPlayer处于错误状态的时候可以调用reset()方法是它进入Idle状态,从而可以再次使用MediaPlayer


三、当调用setDataSource()方法成功时,MediaPlayer进入到Initialized状态


  1. 当在无效状态调用setDataSource()方法时会抛出IllegalStateException异常


四、MediaPlayer必须先进入到Prepared状态,才可以执行播放操作


  1. 有两种方法进入到Prepared状态,一种调用调用同步方法prepare(),第二种调用异步方法prepareAsync()。一旦MediaPlayer进入到Prepared状态,就会回调onPrepared()方法

  2. Preparing状态是一中短暂的状态,当调用异步方法prepareAsync()的时候会处于这种状态,在这种状态下调用MediaPlayer的方法的行为是不可预测的。

  3. 在其它状态(非Initialized状态)下调用prepare()prepareAsync()都会产生IllegalStateException异常

  4. Prepared状态下,下面的属性audio/sound volume, screenOnWhilePlaying, looping可以通过适当的方法设置或改变


五、为了启动播放,需要调用start()方法,调用成功后进入到Started状态,之后可以调用isPlaying方法判断MediaPlayer是否处于该状态


  1. MediaPlayer处于Started状态,android内部播放引擎就会回调onBufferingUpdate()方法,这个方法使用setOnBufferingUpdateListener(OnBufferingUpdateListener)方法进行注册。onBufferingUpdate()为应用程序提供了跟踪缓冲状态的机制

  2. 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()方法可以获取当前的播放位置


八、当播放完成时

  1. 如果loopingtrue,那么再次进入Started状态,循环播放

  2. 如果loopingfalse,那么android的播放引擎就会回调OnCompletion.onCompletion()方法,此时MediaPlayer处于PlaybackCompleted状态




猜你喜欢

转载自blog.csdn.net/qq_34017326/article/details/51994269
今日推荐