android的MediaPlayer的简介

  简介

http://developer.android.com/reference/android/media/MediaPlayer.html

 

状态图

单个剪头的代表同步方法调用,两个箭头的代表异步调用。



 

对于这个状态图,可以看到MediaPlayer有一下几个状态:

1.当MediaPlayer对象创建或者调用  reset() 后,他就是“Idle 状态”;调用release() 后,变为 "End 状态".

这两个状态之间就是MediaPlayer的生命周期的循环。

 

  • 有一个容易忽略,但要注意的,新建一个对象,或者调用reset后,在新创建对象后调用一些方法,会执行出错,但是不会调用OnError,状态也不会变。如果在reset之后,就会调用onError,并且状态编程 “Error状态”
  • 推荐在MediaoPlayer不再使用的时候,立即调用release() 会方便资源立即释放。资源可能包括单个资源,比如硬件加速组件。MediaPlayer在“End 状态“的话就不能回到其它状态。
  • MediaPlayer 创建后在 “idle状态”,如果使用重载的 create方法,就不是“Idle状态”,事实上,对象用create创建成功后就在“prepared状态”。

2.事实上,很多操作会由于一系列的原因导致失败,如不支持的音频文件,poorly interleaved,resolution too high,流超时,如果从“error 状态“重新利用MediaPlayer,调用reset可以转换idle状态。注册error监听是个好的习惯。

3.MediaPlayer必须先进入Prepared状态才能播放。

扫描二维码关注公众号,回复: 605625 查看本文章

4.开始播放,start必须调用,调用start后返回成功,MediaoPlayer变为start模式。isPlaying()返回当前MediaPlayer是否是播放

  • 当是start状态,用户注册了setOnBufferingUpdateListener(OnBufferingUpdateListener). 监听会调用OnBufferingUpdateListener.onBufferingUpdate()回调。
  • started状态调用start没有效果。

5. 播放可以暂停和停止,并且当前的播放位置可以调整,通过pause()来暂停,MediaPlayer会进入pause状态.在start到pause的过程是异步的,所以调用isPlaying()的时候需要稍稍等待状态转换。在流内容的时候可能到1s。

  • 调用start重新播放一个暂停的mediaPlayer对象。会从暂停的地方重新播放。
  • pause状态调用pause()没有任何影响。 

6.调用stop 可以停止播放,MediaPlayer的状态会从  Started, Paused, Prepared or PlaybackCompleted state 到 stop状态

  • 在stopped state,播放前需要调用 prepare() or prepareAsync() 再次回到Prepared 状态
  • 在stopped状态调用stop没有影响. 

7.可以用seekTo 来调整播放位置

  • 可以在  Prepared, Paused and PlaybackCompleted 状态中调整
  • 尽管是同步操作,但是可能要等一小会才能完成.特别是流的时候.如果监听了 setOnSeekCompleteListener(OnSeekCompleteListener),那么在完成的时候会调用OnSeekComplete.onSeekComplete().
  • 还有,通过 getCurrentPosition()获取当前播放位置.

8.播放到最后,播放就完成了

  • 如果是循环模式(setLooping(boolean)),MediaPlauer仍然是 Started state.
  • 如果不是循环模式,如果用户注册了监听,则会调用 OnCompletion.onCompletion(),然后状态变为 PlaybackCompleted state.
  • 在 PlaybackCompleted state.调用start可以重新从起点开始播放.

9.权限

  • 需要添加一个唤醒( WAKE_LOCK)权限,联网的话需要添加Internet权限。

 

 

猜你喜欢

转载自20142014.iteye.com/blog/2013009
今日推荐