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对象可以有如下几种状态
当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
后面略
- MediaPlayer类介绍
- MediaPlayer类介绍-----继承自object
- android MediaPlayer 架构介绍
- MediaPlayer 常用方法介绍
- Android Mediaplayer详细介绍
- MediaPlayer 的使用介绍
- MediaPlayer状态介绍
- MediaPlayer 常用方法介绍
- MediaPlayer 常用方法介绍
- MediaPlayer 和 VideoView介绍
- MediaPlayer类
- MediaPlayer类
- Android的MediaPlayer架构介绍
- Android的MediaPlayer架构介绍
- Android的MediaPlayer架构介绍
- Android的MediaPlayer架构介绍
- Android的MediaPlayer架构介绍
- Android的MediaPlayer架构介绍
- 关于强制转换操作符reinterpret_cast的实验和总结
- MACHINE_START分析
- 【python初学】自动删除目录下空文件夹脚本
- C++中的头文件
- 浙大计算机研究生复试上机考试2005年 A+B
- MediaPlayer类介绍
- Struts2 result type="stream"的用法
- LINQ to XML 编程基础
- Android 消息机制(Java层)
- StringUtils 截取字符串 substring
- picture control 设置为图片大小
- VS2010 Predefined Macros
- android NDK开发、编译、调试环境搭建与操作入门
- pipe unblock select in linux