我收到此错误Fatal Exception: java.lang.IllegalStateException
This YouTubePlayer has been released
,但未明确调用release()
。这是发生崩溃的代码段:
if(youtubePlayer != null){
time = youtubePlayer.getCurrentTimeMillis();//exception may occur
}
可以检查youtubePlayer
是released
吗?有没有回调?感谢。
答案 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);
}
}