MediaPlayer类介绍

来源:互联网 发布:数据统计口径 编辑:程序博客网 时间:2024/06/16 02:16

原文地址:http://developer.android.com/reference/android/media/MediaPlayer.html

 

MediaPlayer类继承自object

 

类概述


MediaPlayer类主要是用于控制视音频文件以及流媒体的播放。关于如何使用类成员方法的例子可以参考VideoView。

本篇主要介绍如下几部分:

1、状态转换图

2、合法和非法状态下的成员调用规则

3、权限问题

4、注册信息和错误的回调函数 ?

 

大家可以通过Media Playback 介绍获取更多信息

 

状态转换图


视音频文件或者流媒体的播放控制是通过状态机来管理的。下面的图揭示了各种控制操作下(start、pause、seek、resume、close)MediaPlayer对象的状态及生命周期。

椭圆代表状态

圆形代表操作(也就是驱动MediaPlayer状态改变的行为)。图中有两种圆形

----单箭头的圆形代表同步方法调用

----双箭头的圆形代表异步的方法调用

MediaPlayer State diagram

通过上图可以看出,一个MediaPlayer对象可以有如下几种状态

 

  • 当MediaPlayer对象刚通过new方法创建或者调用了reset方法之后,对象出于空闲(Idle)状态;当调用了release()方法后,进入结束(End)状态,介于这两者之间的状态是此对象的生命周期。

     

     

    • 在刚通过new创建的MediaPlayer对象和调用reset方法达到空闲状态的对象之间有个微小但却重要的差别。两种情况下调用成员方法如getCurrentPositon(),getDuration等都会返回程序错误。当对象被销毁后调用上述方法,用户提供的回调函数 OnErrorListener.onError()将不会被调用,而且状态也不会发生改变,但是当reset()方法调用结束后调用上面方法,则OnErrorListener.onError()将会被调用,MediaPlayer对象的状态也会转换到ERROR状态

       

    • 当MediaPlayer对象不会再被使用时,建议立即调用release()方法,这样与MediaPlayer关联的内部播放器引擎占用的资源就会被立即释放。资源包括一些类似硬件加速器的单例资源,一旦调用release失败,可能会导致随后的一些MediaPlayer对象都运行失败。一旦对象出于结束(End)状态,将不能重新运行也不能再进行状态转换。

       

    • 此外,通过new创建的MediaPlayer对象出于IDLE状态,但其他通过调用重载的create方法创建的对象则不处于空闲(IDLE)状态,。实际上,对象会出于就绪(Prepared)状态,如果调用create方法成功

       

  • 通常,由于很多原因一些操作会失败,例如视音频格式不支持,pooly interleaved audio/video, 分辨率过高,接收流超时,等等。但是报告错误以及从错误中恢复在这些情况下是需要重点关注的。有时候由于程序错误,在某个状态下执行某个操作也有可能发生错误。上面情况发生后,内部的播放器引擎会调用用户提供的 OnErrorListener.onError() 方法。此监听者会在之前通过setOnErrorListener(android.media.MediaPlayer.OnErrorListener)注册.

    • 一旦错误发生,MediaPlayer对象会切换到错误(Error)状态,即便错误监听函数未被注册

       

    • 为了重用MediaPlayer对象,当进入错误状态时,可调用reset()方法重新切换到空闲状态继续使用

       

    • 提供错误监听方法是好的编程风格

       

    • 当在非法状态下调用prepare()等操作时,为了避免程序错误,会抛出illegalStateException 异常

       

  • 调用 setDataSource(FileDescriptor), or setDataSource(String), or setDataSource(Context, Uri), or setDataSource(FileDescriptor, long, long) 会切换MediaPlayer对象状态从空闲状态到初始化结束状态。

    • 当在其他状态调用setDataSource都会抛illegalStateException 异常

       

    • 查询setDataSource抛出的illegalStateException 和 IOException 异常是良好的编程风格

       

  • 在启动播放之前MediaPlayer对象应首先进入就绪状态

    • 有两种方法进入就绪状态:同步和异步。prepare调用会转换状态至就绪状态当调用结束时,而prepareasync调用在调用结束时会将状态切换到Preparing状态,同时内部的播放器引擎继续后面的准备工作,直到准备工作完成。当准备工作完成或者prepare调用结束时,内部的播放器引擎会调用用户提供的回调函数onPrepare(),如果之前通过setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)注册。

       

    • Preparing状态是中间状态,在此状态下调用其他方法会得到不可知的结果

       

    • 在其他状态调用prepare或者prepareasync方法时会抛出IllegalStateException 异常

       

    • 在就绪状态下,可以调用相应的设置函数来设置音频/声音的音量,开关屏、循环等

  • 需要调用start方法切换到启动(start)状态,调用成功返回后,MediaPlayer对象会出于运行(Started)状态,可通过isPlaying来查询

    • 当进入运行(started)状态时,内部的播放器引擎会调用用户提供的OnBufferingUpdateListener.onBufferingUpdate(),如果前面注册了。注册方法 setOnBufferingUpdateListener(OnBufferingUpdateListener)。此方法允许用户在播放流媒体时追踪缓冲区的状态

    • 调用start方法对MediaPlayer对象没影响,因为对象已经是运行状态

  • 播放过程可以暂停或者停止,播放进度也可以调整。通过调用pause方法进入暂停状态.需要知道的是状态的切换(不管是从运行状态至暂停状态还是从暂停状态恢复到运行状态)对底层播放器引擎都是异步的。可能会花费一些时间状态才能切换过来,可通过isplaying查询,对于流媒体花费的时间更久

    • 调用start可从暂停状态恢复播放,并且恢复播放后播放位置会在暂停的位置继续,当调用start正常返回时,MediaPlayer对象的状态会再次切换到运行状态

    • 在暂停状态再次调用pause方法将不会起任何作用

  • 调用stop方法会使得MediaPlayer对象切换到停止状态,不论之前对象状态是运行中、暂停、就绪还是播放完成。

    • 当处于停止状态时,可重新调用prepare或者prepareasync重新启动

    • 当处于停止状态时,再次调用stop方法将不起作用

  • 可以通过调用seekto(int)方法调整播放位置

    • seekto是异步调用,实际的seek操作会持续一段时间才能结束,特别是对于网络流。当seek成功后,内部播放器引擎会调用外部提供的OnSeekComplete.onSeekComplete()回调函数。注册方法setOnSeekCompleteListener(OnSeekCompleteListener).

    • seekto也可以在其他状态调用,如就绪、暂停或者播放结束状态

    • 此外,可以通过调用getCurrentPosition来获取当前播放位置,用于跟踪播放进度

  • 当播放到达文件尾,播放结束

    • 如果通过setLooping设置了loop标志位,MediaPlayer对象将保持运行状态

    • 若loop标志位为false,播放结束内部播放器引擎会调用用户层回调函数OnCompletion.onCompletion(),注册函数 setOnCompletionListener(OnCompletionListener).用于通知用户层,播放器正处于播放结束状态

    • 当处于播放结束状态时,调用start方法可以重新开始播放

 

合法和非法状态下的成员调用规则


列出了 MediaPlayer类的各个成员方法调用规则。请自行阅读:http://developer.android.com/reference/android/media/MediaPlayer.html    

 

后面略

原创粉丝点击