Android: Как правильно инициализировать проигрыватель YouTube внутри себя?

Я пытаюсь инициировать игрока YouTube внутри действия. Однако время от времени я получаю это исключение:

Fatal Exception: java.lang.IllegalStateException YouTubeServiceEntity not initialized 

Вот как я пытаюсь инициализировать проигрыватель YouTube в своей деятельности. (Это делается внутри OnCreate ())

  try { final YouTubePlayerView youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view); youTubeView.initialize("KEY", new YouTubePlayer.OnInitializedListener() { @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean Boolean) { if(ad==null || ad.getVideo_urls() == null) return; if (!Boolean) { try { if (ad.getVideo_urls() != null && ad.getVideo_urls().length() > 0) { String url = ad.getVideo_urls().getString(0); if (url.contains("youtube")) { String id = ad.getVideo_urls().getString(0).split("embed/")[1]; youTubeView.setVisibility(View.VISIBLE); MyYouTubePlayer = youTubePlayer; MyYouTubePlayer.cueVideo(id); } } else { youTubeView.setVisibility(View.GONE); Log.i(Constants.getTag(), "Video not found"); //Making sure the MyYouTubePlayer is null and if not is being released if(MyYouTubePlayer != null) { MyYouTubePlayer.release(); } } } catch (JSONException e) { youTubePlayer.release(); e.printStackTrace(); } } } @Override public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { youTubeView.removeAllViews(); } }); } catch(Exception e){ e.printStackTrace(); Log.e("Youtube", "error initializing youtube"); } 

Самое странное, что этот вопрос не является постоянным. Время от времени это происходит, и я понятия не имею, почему. Можете ли вы сказать мне, что может быть причиной этого?

Здесь также находится logcat:

 java.lang.IllegalStateException: YouTubeServiceEntity not initialized at android.os.Parcel.readException(Parcel.java:1433) at android.os.Parcel.readException(Parcel.java:1379) at com.google.android.youtube.player.internal.l$a$aa() at com.google.android.youtube.player.internal.oa() at com.google.android.youtube.player.internal.ad.a() at com.google.android.youtube.player.YouTubePlayerView.a() at com.google.android.youtube.player.YouTubePlayerView$1.a() at com.google.android.youtube.player.internal.rg() at com.google.android.youtube.player.internal.r$ca() at com.google.android.youtube.player.internal.r$ba() at com.google.android.youtube.player.internal.r$a.handleMessage() at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4960) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) at dalvik.system.NativeStart.main(NativeStart.java) 

У меня тоже была эта ошибка, я работал над ней, создав собственный класс, расширяющий YouTubePlayerSupportFragment , может быть, мой код действительно поможет вам, который отлично работает для меня.

Я инициализирую свой проигрыватель YouTube таким образом:

 private String currentVideoID = "<your video id>"; private YouTubePlayer activePlayer; private void init() { initialize(ConstantsRepository.GOOGLE_API_SERVER_KEY, new YouTubePlayer.OnInitializedListener() { @Override public void onInitializationFailure(YouTubePlayer.Provider arg0, YouTubeInitializationResult arg1) { // youtube is not installed } @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) { activePlayer = player; activePlayer.setPlayerStyle(YouTubePlayer.PlayerStyle.DEFAULT); if (!wasRestored) { activePlayer.loadVideo(getArguments().getString("url"), 0); } } }); } 

В вашей деятельности укажите фрагмент youtube в layout.xml и выполните следующую замену в onCreate:

  YTPlayerFragment myFragment = YTPlayerFragment.newInstance("oVkK3X9zMyI"); getFragmentManager().beginTransaction().replace(R.id.youtube_container, myFragment).commit(); 

Эта нить похожа и помогла мне:

Инициализация проигрывателя YouTube в фрагменте

Это также было полезно: борьба с фрагментом поддержки проигрывателя Youtube

После некоторого копания я нашел свою проблему. Проблема заключалась в использовании библиотеки youtube. Он устарел и ЗДЕСЬ все было прекрасно 🙂

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

Я просто использую try-catch, чтобы избежать этого, и, к счастью, он еще не был воспроизведен.

 try { mYouTubePlayerFragment.initialize(DEVELOPER_KEY, this); } catch(IllegalStateException w){} 

Опять это не может быть верным решением.

Одним из решений может быть проверка OnBackPressed() ли инициализирован проигрыватель.

 isInitializationComplete = false @Override public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean b) { isInitializationComplete = true; } @Override public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) { isInitializationComplete = true; } @Override public void onBackPressed() { if(!isInitializationComplete) return; } 

Попробуйте обезьяну, чтобы воспроизвести ее чаще.

 adb shell monkey -p com.packagename -v 500 

Вот ссылка на пробник для этой ошибки.