2014-01-24 3 views
9

Я получаю эту ошибку Fatal Exception: java.lang.IllegalStateException This YouTubePlayer has been released, но release() не был назван explicitly.Here является кусок кода, где происходит сбой:Android: YouTube плеер был выпущен

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

это можно проверить, что youtubePlayer был released? Любой обратный вызов? Благодарю.

+0

Можете ли вы пост, как вы создаете экземпляр youtubePlayer? Также вы выполняете любые слушатели? – Kakarot

+0

Вы используете YouTubePlayerFragment или YouTubePlayerView или YouTubeStandalonePlayer – Kakarot

+0

@Kakarot, Привет, Я использую YouTubePlayerSupportFragment' - для просмотра yt и интерфейса YouTubePlayer для проигрывателя. Вот код инициализации: 'youTubeView.initialize (YouTubeUtils.DEVELOPER_KEY, \t \t \t \t \t mPlayerInitializedListener);' и я получаю экземпляр игрока в этом обратном: 'общественного недействительного onInitializationSuccess (YouTubePlayer.Provider провайдера, \t \t \t \t конечный игрок YouTubePlayer, boolean wasRestored) {...} '. Спасибо –

ответ

0

Тип переменной, возвращаемой youtubePlayer.getCurrentTimeMillis();, является int.
Это должно работать:

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

Java - сильно типизированный язык –

1

Я исправил эту проблему, сделав видеоплеер нуль в onDestroy деятельности.

Edit:

Пробовал в onStop и она отлично работает.
@MickeyTin, спасибо ..

+0

В моем случае игрок может быть выпущен до' onDestroy' –

12

Большая часть кода в SDK Youtube запутана, что делает его очень трудным для отладки. И тот факт, что нет никакого прямого метода для проверки того, был ли выпущен YoutubePlayer или нет, тоже не помогает.

Сказав, что я думаю, что делает YoutubePlayer нуль (в OnStop()), кажется, больше взломать чем правильное решение мне. Вы должны освободить YoutubePlayer в onDestroy() и не назначать вручную его нигде в любом месте. Один простой подход для проверки того, был ли выпущен YoutubePlayer или нет, - , выложите ваши вызовы (например, youtubePlayer.loadVideo(), cueVideo(), getCurrentTimeMillis() и т. Д.) В блок catch try и поймаете исключение IllegalStateException.

Согласно Youtube SDK documentation об ошибках:

общественности статической окончательный YouTubePlayer.ErrorReason UNEXPECTED_SERVICE_DISCONNECTION

воспроизведение было отменено, и игрок был освобожден из-за неожиданного отключения от API YouTube оказание услуг. Любые дальнейшие вызовы на этот проигрыватель приведут к ошибкам, для повторного включения воспроизведения необходимо создать экземпляр нового игрока .

Итак, чтобы создать новый экземпляр YoutubePlayer, просто вызовите метод initialize() в блоке catch.

Пример:

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(); 
} 
0

Это, как мне удалось избавиться от этого исключения.В моем случае это было выброшено на onSaveInstanceState, где я попытался сохранить текущую позицию игрока, используя один и тот же кусок кода:

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

и при преуспевающей инициализации плеера в onInitializationSuccess я продолжал играть видео, используя значение в времени, назначенном в OnCreate от Bundle.

Но оказалось, что такой подход не нужен. Чтобы избежать исключения, я просто добавил атрибут android:configChanges="orientation|screenSize" к активности моего игрока в манифесте. Это заставляет систему обрабатывать изменения ориентации самостоятельно, и добавление времени параметр для воспроизведения видео становится излишним. Это то, что проверяет флаг isRestored сделан для onInitializationSuccess.

Вот краткое изложение изменений:

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); 
     } 
    } 
Смежные вопросы