Android:youtube播放器已经发布

时间:2014-01-24 12:29:14

标签: java android youtube-api android-youtube-api

我收到此错误Fatal Exception: java.lang.IllegalStateException This YouTubePlayer has been released,但未明确调用release()。这是发生崩溃的代码段:

if(youtubePlayer != null){
 time = youtubePlayer.getCurrentTimeMillis();//exception may occur
}

可以检查youtubePlayerreleased吗?有没有回调?感谢。

4 个答案:

答案 0 :(得分:14)

Youtube SDK中的大多数代码都经过混淆,这使得调试变得非常困难。事实上没有任何直接的方法来检查YoutubePlayer是否已经发布也没有帮助。

说过我认为使YoutubePlayer为null(在onStop()中)对我来说似乎更像是 hack 而不是正确的解决方案。您应该在onDestroy()中释放YoutubePlayer,并且不要在任何地方手动将其指定为null。检查YoutubePlayer是否已被释放的一种简单方法是将您的调用(如youtubePlayer.loadVideo(),cueVideo(),getCurrentTimeMillis()等)放入try catch块并捕获IllegalStateException异常。 / strong>

根据Youtube SDK documentation错误:

  

public static final YouTubePlayer.ErrorReason   UNEXPECTED_SERVICE_DISCONNECTION

     

播放已被取消且播放器已被释放   与YouTube API服务意外断开连接。任何进一步   调用此播放器实例将导致错误,一个新玩家   必须创建实例才能重新启用播放。

因此,要创建YoutubePlayer的新实例,只需在catch块中调用initialize()方法。

示例:

public void setVideoId(final String videoId) {
    if (videoId != null && !videoId.equals(this.videoId)) {
        this.videoId = videoId;
        if (youtubePlayer != null) {
            try {
                youtubePlayer.loadVideo(videoId);
            } catch (IllegalStateException e) {
                initialize(API_KEY, this);
            }
        }
    }
}

@Override
public void onDestroy() {   
    if (youtubePlayer != null) {
        youtubePlayer.release();
    }
    super.onDestroy();
}

答案 1 :(得分:1)

我通过在活动的onDestroy中使videoPlayer为空来解决此问题。

修改

onStop中尝试过并且运行正常。
@MickeyTin,谢谢..

答案 2 :(得分:0)

youtubePlayer.getCurrentTimeMillis();返回的变量类型为int 这应该有效:

if(youtubePlayer != null){
 int millis = youtubePlayer.getCurrentTimeMillis();//exception may occur
}

答案 3 :(得分:0)

这就是我设法摆脱这种异常的方法。在我的情况下,它被抛到onSaveInstanceState上,我尝试使用相同的代码保存当前玩家位置:

if(youtubePlayer != null){ time = youtubePlayer.getCurrentTimeMillis(); }

在onInitializationSuccess中成功完成播放器初始化后,我继续使用来自Bundle的onCreate中指定的时间值播放视频。

但事实证明这种方法是不必要的。为了避免异常抛出,我只在清单中为我的播放器活动添加了android:configChanges="orientation|screenSize"属性。这使得系统自动处理方向更改,并且添加时间参数以提示视频变得多余。这是在onInitializationSuccess中检查 wasRestored 标志的原因。

以下是更改摘要:

的AndroidManifest.xml:

<activity android:name=".VideoPlayerActivity"
android:configChanges="orientation|screenSize"/>

VideoPlayerActivity.java:

@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
        this.mPlayer = player;
        if (!wasRestored) {
            mPlayer.loadVideo(mVideoId);
        }
    }