Android : youtube 播放器已发布
Posted
技术标签:
【中文标题】Android : youtube 播放器已发布【英文标题】:Android : youtube player has been released 【发布时间】:2014-02-15 10:51:49 【问题描述】:我收到此错误Fatal Exception: java.lang.IllegalStateException
This YouTubePlayer has been released
,但未明确调用release()
。这是发生崩溃的代码:
if(youtubePlayer != null)
time = youtubePlayer.getCurrentTimeMillis();//exception may occur
是否可以检查youtubePlayer
是否为released
?有回调吗?谢谢。
【问题讨论】:
你能发布你是如何创建 youtubePlayer 实例的吗?你的 Activity 还实现了任何 Listeners 吗? 您使用的是 YouTubePlayerFragment 还是 YouTubePlayerView 还是 YouTubeStandalonePlayer @Kakarot,嗨,我正在使用 YouTubePlayerSupportFragment` - 用于 yt 视图,YouTubePlayer
用于播放器接口。这是初始化代码:youTubeView.initialize(YouTubeUtils.DEVELOPER_KEY, mPlayerInitializedListener);
,我在此回调中获得了播放器的实例:public void onInitializationSuccess(YouTubePlayer.Provider provider, final YouTubePlayer player, boolean wasRestored) ...
.Thanks
【参考方案1】:
Youtube SDK 中的大部分代码都被混淆了,这使得调试变得非常困难。 没有任何直接的方法可以检查 YoutubePlayer 是否已发布这一事实也无济于事。
话虽如此,我认为 让 YoutubePlayer 为空(在 onStop() 中)对我来说似乎更像是一种 hack 而不是适当的解决方案。您应该在 onDestroy() 中释放 YoutubePlayer,并且不要在任何地方手动将其分配为 null。检查 YoutubePlayer 是否已发布的一种简单方法是将您的调用(如 youtubePlayer.loadVideo()、cueVideo()、getCurrentTimeMillis() 等)放入 try catch 块并捕获 IllegalStateException 异常。
根据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();
【讨论】:
【参考方案2】:我通过在 Activity 的 onDestroy
中将 videoPlayer 设为 null 来解决此问题。
编辑:
在onStop
中尝试过,效果很好。
@MickeyTin,谢谢..
【讨论】:
在我的情况下,播放器可以在onDestroy
之前发布【参考方案3】:
youtubePlayer.getCurrentTimeMillis();
返回的变量类型是int
。
这应该有效:
if(youtubePlayer != null)
int millis = youtubePlayer.getCurrentTimeMillis();//exception may occur
【讨论】:
Java 是一种强类型语言【参考方案4】:这就是我设法摆脱这个异常的方法。就我而言,它被抛出 onSaveInstanceState ,我尝试使用相同的代码保存当前玩家位置:
if(youtubePlayer != null) time = youtubePlayer.getCurrentTimeMillis();
在 onInitializationSuccess 中成功初始化播放器后,我继续使用在 Bundle 的 onCreate 中分配的 time 值播放视频。
但事实证明,这种做法是不必要的。为了避免抛出异常,我刚刚在清单中的玩家活动中添加了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);
【讨论】:
以上是关于Android : youtube 播放器已发布的主要内容,如果未能解决你的问题,请参考以下文章
ionic 嵌入式 youtube 视频停止在 iOS 上播放