美文网首页
Android MediaPlayer的状态管理

Android MediaPlayer的状态管理

作者: 岁月神偷_4676 | 来源:发表于2020-08-26 14:59 被阅读0次

    用过MediaPlayer来实现音视频播放功能的同学应该都知道MediaPlayer是基于状态的,也就是说MediaPlayer内部保留着一个状态机,用于管理内部的状态。在编写代码时必须始终注意,某些操作仅在播放器处于特定状态时才有效。如果在错误的状态下执行某项操作,则系统可能会抛出异常或导致其他不良行为。

    下图展示了android MediaPlayer 的所有状态以及状态之间的转换,该图说明了从哪些状态可以通过调用哪些方法从而将MediaPlayer变为另一种状态。图中,蓝色的椭圆表示MediaPlayer对象可能驻留的状态。弧线表示驱动MediaPlayer对象状态转换的播放控制操作(也即可以调用的方法)。有两种类型的弧线,具有单箭头的弧表示同步方法调用,而具有双箭头的弧表示异步方法调用。


    MediaPlayer状态转换图

    下面通过文字来对上图的状态变化做一些说明:

    在编写与 MediaPlayer相关的代码时,请始终牢记该状态图,因为从错误的状态调用其方法是导致错误发生的常见原因。

    最后附上MediaPlayer各接口方法的调用时机:

    方法名称           有效状态 无效状态 说明
    attachAuxEffect {Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} {Idle, Error} 此方法必须在setDataSource之后调用。调用它不会更改对象状态
    getCurrentPosition {Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} {Error} 在有效状态下成功调用此方法不会更改状态。在无效状态下调用此方法会将对象转移到错误状态
    getDuration {Prepared, Started, Paused, Stopped, PlaybackCompleted} {Idle, Initialized, Error} 在有效状态下成功调用此方法不会更改状态。在无效状态下调用此方法会将对象转移到错误状态
    getVideoHeight {Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} {Error} 在有效状态下成功调用此方法不会更改状态。在无效状态下调用此方法会将对象转移到错误状态
    getVideoWidth {Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} {Error} 在有效状态下成功调用此方法不会更改状态。在无效状态下调用此方法会将对象转移到错误状态
    isPlaying {Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted} {Error} 在有效状态下成功调用此方法不会更改状态。在无效状态下调用此方法会将对象转移到错误状态
    pause {Started, Paused, PlaybackCompleted} {Idle, Initialized, Prepared, Stopped, Error} 在有效状态下成功调用此方法会将对象转移到“ 暂停”状态。在无效状态下调用此方法会将对象转移到错误状态
    prepare {Initialized, Stopped} {Idle, Prepared, Started, Paused, PlaybackCompleted, Error} 在有效状态下成功调用此方法会将对象转移到Prepared状态。在无效状态下调用此方法将引发IllegalStateException
    prepareAsync {Initialized, Stopped} {Idle, Prepared, Started, Paused, PlaybackCompleted, Error} 在有效状态下成功调用此方法会将对象转移到“ 准备”状态。在无效状态下调用此方法将引发IllegalStateException
    release Any release()之后该对象不再可用
    reset {Idle, Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error} {} reset之后,对象就像刚刚创建
    seekTo {Prepared, Started, Paused, PlaybackCompleted} {Idle, Initialized, Stopped, Error} 在有效状态下成功调用此方法不会更改状态。在无效状态下调用此方法会将对象转移到错误状态
    setDataSource {Idle} {Initialized, Prepared, Started, Paused, Stopped, PlaybackCompleted, Error} 在有效状态下成功调用此方法会将对象转移到初始化状态。在无效状态下调用此方法将引发IllegalStateException
    setLooping {Idle, Initialized, Stopped, Prepared, Started, Paused, PlaybackCompleted} {Error} 在有效状态下成功调用此方法不会更改状态。在无效状态下调用此方法会将对象转移到错误状态
    setVolume {Idle, Initialized, Stopped, Prepared, Started, Paused, PlaybackCompleted} {Error} 成功调用此方法不会更改状态
    start {Prepared, Started, Paused, PlaybackCompleted} {Idle, Initialized, Stopped, Error} 在有效状态下成功调用此方法会将对象转移到“ 开始”状态。在无效状态下调用此方法会将对象转移到错误状态
    stop {Prepared, Started, Stopped, Paused, PlaybackCompleted} {Idle, Initialized, Error} 在有效状态下成功调用此方法会将对象转移到“已停止”状态。在无效状态下调用此方法会将对象转移到错误状态

    相关文章

      网友评论

          本文标题:Android MediaPlayer的状态管理

          本文链接:https://www.haomeiwen.com/subject/myhxsktx.html