Android MediaPlayer设置表面非法状态

时间:2016-03-14 13:09:19

标签: android media-player android-mediaplayer illegalstateexception

我有一个ListView,其中包含视频作为项目。在某些情况下,当我尝试设置表面时,我收到IllegalStateException。 源代码:

        if(surfaceTexture != null){
          mSurface = new Surface(surfaceTexture);
          mMediaPlayer.setSurface(mSurface);
        }

例外:

Fatal Exception: java.lang.IllegalStateException
android.media.MediaPlayer._setVideoSurface (MediaPlayer.java)
android.media.MediaPlayer.setSurface (MediaPlayer.java:829)

然而,Android MediaPlayer文档声明可以在任何状态下调用setSurface。

  

setSurface   任何   {}   可以在任何状态下调用此方法,并且调用它不会更改对象状态。

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

我无法重现此异常,我不知道MediaPlayer在异常期间处于哪种状态。

任何想法?

1 个答案:

答案 0 :(得分:0)

如果播放器尚未初始化或已经在没有意识到的情况下已经发布,则会发生这种情况。 MediaPlayer的documentation似乎并未反映我所经历的行为。我已经遇到它在非常早期调用setSurface时抛出IllegalStateException,其中mediaPlayer对象不为null但可能在调用release之后没有初始化和单独调用。为了解决这个问题,我只是抓住了异常:

try {
    mediaPlayer.setSurface(surface);
} catch (Exception e) {
    Log.i("TAG", "MediaPlayer setSurface failed.");
}

由于调用setSurface的回调在整个回放设置中被多次击中,因此在调用start时,表面已经被设置,而不会抛出异常。