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 播放器已发布的主要内容,如果未能解决你的问题,请参考以下文章

在 Android TV 中使用 Youtube API

YouTube API - 另一项活动中的黑屏

YouTube嵌入式播放器获取如何停止视频?

ionic 嵌入式 youtube 视频停止在 iOS 上播放

Android YouTube API“初始化 YouTube 播放器时出错”

Android YouTube 播放器直播