MediaPlayer

媒体播放器
public class MediaPlayer
extends Object

的java.lang.Object


android.media.MediaPlayer

MediaPlayer的类可用于控制音频/视频文件和流回放。 关于如何使用这个类中的方法的一个例子中可以找到VideoView

这里涉及的主题包括:

  • 状态图
  • 有效和无效的state(官网)
  • 权限
  • 注册信息和错误回调

开发人员指南
有关如何使用MediaPlayer的更多信息,请阅读Media PlayBack开发人员指南。

状态图

音频/视频文件的播放控制和流是作为一个状态机进行管理。 下图显示了生命周期,并支持播放控制操作驱动的MediaPlayer对象的状态。 椭圆表示一个MediaPlayer对象可以驻留在的状态。所述弧线表示驱动对象的状态过渡的重放控制操作。 有两种类型的弧线。 具有单箭头头部的弧线表示同步方法调用,而那些与双箭头表示异步方法调用。

MediaPlayer_第1张图片
MediaPlayer的状态图

从这个状态图,可以看到,一个MediaPlayer对象具有以下状态:

  • 当使用刚刚创建的MediaPlayer对象new或reset()被调用时,它处于 Idle空闲 状态; 当release()被调用时,它是在end最终的状态。 这两种状态之间是MediaPlayer对象的生命周期。

有一个新建的MediaPlayer对象和之后的MediaPlayer对象之间的微妙但重要的区别reset()
被调用。 这是一个编程错误调用方法,如

getCurrentPosition()
getDuration()
getVideoHeight()
getVideoWidth()
setAudioStreamType(int)
setLooping(boolean)
,setVolume(float, float)
,pause()
start()
,stop()
seekTo(int)
prepare()
或prepareAsync()

在这两种情况下空闲状态。 如果这些方法被称为MediaPlayer对象构造之后,用户提供的回调方法OnErrorListener.onError()将不会被内部的播放引擎调用和对象状态保持不变; 但是,如果这些方法之后称为reset()
用户提供的回调方法OnErrorListener.onError()将由内部播放引擎调用和该对象将被转移到错误状态。
它也建议,一旦不再被使用的MediaPlayer对象,调用release()
立刻让通过与MediaPlayer对象相关的内部播放引擎所使用的资源可以被立即释放。 资源可以包括单资源,如硬件加速组件和失败调用release()
可能会导致随后的实例对象的MediaPlayer回退到软件的实现或完全失败。 一旦MediaPlayer对象是处于结束状态,它不再使用,有没有办法把它带回来给任何其他状态。
此外,使用创建的对象的MediaPlayernew
处于空闲状态,而那些拥有便捷的重载之一创建create
方法是处于空闲状态。 事实上,对象是在准备状态,如果使用的创建create
方法是成功的。

在一般情况下,某些重放控制操作可能失败,由于各种原因,诸如不支持的音频/视频格式,交织不良音频/视频,分辨率过高,流超时,等等。 因此,错误报告和恢复是在这种情况下一个重要的问题。 有时,由于编程错误,也可能发生在无效状态调用重放控制操作。 在所有这些错误的条件下,内部播放引擎调用提供OnErrorListener.onError如果OnErrorListener已经通过预先注册()方法,用户setOnErrorListener(android.media.MediaPlayer.OnErrorListener)
要注意的是,一旦发生错误,在MediaPlayer物体进入错误状态(除了如上所述),即使错误听者尚未由应用注册是重要的。
为了重新使用MediaPlayer的对象,它是在错误状态,并从错误中恢复,reset()
可以调用对象恢复到空闲状态。

这是良好的编程习惯让你的应用程序注册一个OnErrorListener看出来从内部播放引擎错误通知。
则抛出IllegalStateException以防止编程错误,如调用prepare()
prepareAsync()
或重载setDataSource
处于无效状态的方法。

调用setDataSource(FileDescriptor)
或setDataSource(String)
,或setDataSource(Context, Uri)
或setDataSource(FileDescriptor, long, long)
,或setDataSource(MediaDataSource)

转移处于空闲状态的MediaPlayer对象至初始状态。 如果setDataSource()被调用的任何其他状态抛出IllegalStateException。
这是良好的编程习惯经常去IllegalArgumentException
和IOException
可能从超载被抛出setDataSource方法。

  • 一个MediaPlayer对象必须先进入Prepared准备状态回放才能启动。

有两种方式(同步和异步),该准备状态可以达到:要么调用prepare()
同步)的对象转移到准备状态,一旦方法调用返回,或者调用prepareAsync()
异步),它首先调用返回后对象到准备状态(发生几乎是正确的方式),而内部播放引擎将继续对准备工作的其他工作,直到准备工作完成传输。 当准备完成时或prepare()
调用返回时,内部播放引擎,然后调用OnPreparedListener界面的用户提供的回调方法,onPrepared(),如果OnPreparedListener通过事先设置setOnPreparedListener(android.media.MediaPlayer.OnPreparedListener)

需要注意的是准备状态是过渡状态是很重要的。

It is important to note that the Preparing state is a transient state, and the behavior of calling any method with side effect while a MediaPlayer object is in the Preparing state is undefined.

IllegalStateExceptionprepare()被抛出当prepareAsync()被调用在其他状态下。

而在准备状态,可以初始化音频/声音音量,screenOnWhilePlaying,循环特性可以通过调用相应组的方法进行调整。

要开始播放,start()必须被调用。 之后start()成功返回时,MediaPlayer对象处于启动状态。isPlaying()
可以被调用来测试MediaPlayer对象是否处于启动状态。 而在启动状态下,内部播放引擎调用提供OnBufferingUpdateListener.onBufferingUpdate如果OnBufferingUpdateListener已经通过预先注册()回调方法用户setOnBufferingUpdateListener(OnBufferingUpdateListener)
此回调允许应用程序跟踪缓存状态,而音频/视频流。

调用start()不会生效当MediaPlayer对象是不在启动状态。

回放可以被暂停和停止,并且当前重放位置可以调整。 回放可以通过暂停pause()
当调用pause()
返回后,MediaPlayer对象进入暂停状态。 需要注意的是从开始状态到暂停状态,反之亦然。

调用stop()
停止播放并导致MediaPlayer的在开始暂停准备PlaybackCompleted状态进入停止状态。 一旦处于停止状态,播放不能启动,直到prepare()
或prepareAsync()
被称为重新设置MediaPlayer对象到准备状态。

播放指定位置可以用seekTo(int)和asynchronuousseekTo(int)
调用返回正确的方式,实际操作可能需要一段时间才能完成,尤其是对音频/视频流式传输。 当实际操作完成后,内部播放引擎调用OnSeekComplete.onSeekComplete()如果OnSeekCompleteListener已通过事先注册的用户setOnSeekCompleteListener(OnSeekCompleteListener)

请注意,seekTo(int)
也可以在其他状态被调用,如prepared准备Paused暂停PlaybackCompleted状态。
此外,实际的当前重放位置可以用getCurrentPosition()来获得当前播放进去返回ini类型
它是用于应用程序诸如音乐播放器,需要跟踪的播放进度。

当回放到达流的末尾,则播放完成。 如果循环模式被设定为与真正
的setLooping(boolean)
,则MediaPlayer对象将保持在启动状态。
如果循环模式设置为false,
播放引擎会调用用户提供的回调方法,OnCompletion.onCompletion(),如果OnCompletionListener通过事先设置setOnCompletionListener(OnCompletionListener)
回调信号,对象现在是在PlaybackCompleted状态的调用。
而在PlaybackCompleted状态,呼叫start()
可以重新启动从音频/视频源的开头播放。

权限

人们可能需要声明一个相应的许可WAKE_LOCK
这些类可能需要网络权限

回调

应用程序可能需要的信息和错误事件,以便注册播放或流过程中一些内部状态更新和可能的运行时错误的通知。 注册这些事件是由正确设置相应的侦听器

(通过调用完成setOnPreparedListener(OnPreparedListener)
setOnPreparedListener,setOnVideoSizeChangedListener(OnVideoSizeChangedListener)
setOnVideoSizeChangedListener,setOnSeekCompleteListener(OnSeekCompleteListener)
setOnSeekCompleteListener,setOnCompletionListener(OnCompletionListener)
setOnCompletionListener,setOnBufferingUpdateListener(OnBufferingUpdateListener)
setOnBufferingUpdateListener,setOnInfoListener(OnInfoListener)
setOnInfoListener,setOnErrorListener(OnErrorListener)
setOnErrorListener等)。

为了接收与这些监听相关联的相应的回调,应用程序可能需要创建其他线程来执行回调。

你可能感兴趣的:(MediaPlayer)