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$a.a()
   at com.google.android.youtube.player.internal.o.a()
   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.r.g()
   at com.google.android.youtube.player.internal.r$c.a()
   at com.google.android.youtube.player.internal.r$b.a()
   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) 

Ответ 1

Я также сталкиваюсь с этой ошибкой прямо сейчас в своем приложении. Проблема возникает, когда пользователь выходит из фрагмента проигрывателя 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

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

Ответ 2

У меня тоже была эта ошибка, я работал над ней, создав собственный класс, расширяющий 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

Ответ 3

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

Ответ 4

Попробуйте таким образом

Здесь активность расширена с YouTubeBaseActivity, которая будет присутствовать в YouTubeAndroidPlayerApi.jar. Эта активность также содержит несколько методов прослушивания инициализации, чтобы узнать статус проигрывателя YouTube. и следуйте этому примеру за дополнительной помощью.

import android.content.Intent;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Toast;

import com.google.android.youtube.player.YouTubeBaseActivity;
import com.google.android.youtube.player.YouTubeInitializationResult;
import com.google.android.youtube.player.YouTubePlayer;
import com.google.android.youtube.player.YouTubePlayer.PlayerStyle;
import com.google.android.youtube.player.YouTubePlayerView;

public class MainActivity extends YouTubeBaseActivity implements
        YouTubePlayer.OnInitializedListener {

    private static final int RECOVERY_DIALOG_REQUEST = 1;

    // YouTube player view
    private YouTubePlayerView youTubeView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        setContentView(R.layout.activity_main);

        youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);

        // Initializing video player with developer key
        youTubeView.initialize(Config.DEVELOPER_KEY, this);

    }

    @Override
    public void onInitializationFailure(YouTubePlayer.Provider provider,
            YouTubeInitializationResult errorReason) {
        if (errorReason.isUserRecoverableError()) {
            errorReason.getErrorDialog(this, RECOVERY_DIALOG_REQUEST).show();
        } else {
            String errorMessage = String.format(
                    getString(R.string.error_player), errorReason.toString());
            Toast.makeText(this, errorMessage, Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onInitializationSuccess(YouTubePlayer.Provider provider,
            YouTubePlayer player, boolean wasRestored) {
        if (!wasRestored) {

            // loadVideo() will auto play video
            // Use cueVideo() method, if you don't want to play it automatically
            player.loadVideo(Config.YOUTUBE_VIDEO_CODE);

            // Hiding player controls
            player.setPlayerStyle(PlayerStyle.CHROMELESS);
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == RECOVERY_DIALOG_REQUEST) {
            // Retry initialization if user performed a recovery action
            getYouTubePlayerProvider().initialize(Config.DEVELOPER_KEY, this);
        }
    }

    private YouTubePlayer.Provider getYouTubePlayerProvider() {
        return (YouTubePlayerView) findViewById(R.id.youtube_view);
    }

}

Ответ 5

Это работа для меня

пожалуйста, загрузите.Jar отсюда

Добавьте YouTubeAndroidPlayerApi.jar в папку с папками.

и ниже активность для воспроизведения видео Youtube

if (url.contains(Constants.YOUTUBE_URL)) {
            final String key[] = url.split("v=");
            if (key.length > 1) {
                final Intent intent = new Intent(getActivity(), YouTubeActivity.class);
                intent.putExtra(Constants.KEY_VIDEO_KEY, key[1]);
                startActivity(intent);
                getActivity().overridePendingTransition(R.anim.anim_zoom_in, R.anim.anim_zoom_out);
            } else {
                Utils.showSnackbarNonSticky(mRecyclerView, "URL is not valid", true, mContext);
            }
        }

ниже активность - воспроизведение видео

public class YouTubeActivity extends YouTubeBaseActivity 
    implements YouTubePlayer.OnInitializedListener, View.OnClickListener {

private static final int RECOVERY_REQUEST = 1;
private YouTubePlayerView youTubeView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_youtube);
    initView();
}

//this method is for the initialization of the view component
private void initView() {
    final LinearLayout llParent = (LinearLayout) findViewById(R.id.activity_you_tube_parent_layout);
    youTubeView = (YouTubePlayerView) findViewById(R.id.youtube_view);
    youTubeView.initialize(Constants.YOUTUBE_DEVELOPER_KEY, this);
    final TextView tvClose = (TextView) findViewById(R.id.activity_you_tube_tv_close);
    tvClose.setOnClickListener(this);

    llParent.setOnTouchListener(new OnSwipeTouchListener(this) {
        public void onSwipeTop() {
        }

        public void onSwipeRight() {
        }

        public void onSwipeLeft() {
        }

        public void onSwipeBottom() {
            finish();
            overridePendingTransition(R.anim.anim_zoom_in, R.anim.anim_zoom_out);
        }

    });

    final WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
    final Window window = this.getWindow();
    lp.copyFrom(window.getAttributes());
    lp.width = WindowManager.LayoutParams.MATCH_PARENT;
    lp.height = WindowManager.LayoutParams.MATCH_PARENT;
    window.setAttributes(lp);
}

@Override
public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer player, boolean wasRestored) {
    if (!wasRestored) {
        player.loadVideo(getIntent().getStringExtra(Constants.KEY_VIDEO_KEY));
        player.setShowFullscreenButton(false);
    }
}

@Override
public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult errorReason) {
    if (errorReason.isUserRecoverableError()) {
        errorReason.getErrorDialog(this, RECOVERY_REQUEST).show();
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == RECOVERY_REQUEST) {
         getYouTubePlayerProvider().initialize(Constants.YOUTUBE_DEVELOPER_KEY, this);
    }
}

protected YouTubePlayer.Provider getYouTubePlayerProvider() {
    return youTubeView;
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.activity_you_tube_tv_close:
            finish();
            this.overridePendingTransition(R.anim.anim_zoom_in, R.anim.anim_zoom_out);
            break;
    }
}

@Override
public void onBackPressed() {
    final boolean backEnable = false;
    if (backEnable) {
        super.onBackPressed();
    }
}

}

XML ниже

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_you_tube_parent_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlackOpacity60"
android:gravity="center"
android:orientation="vertical">

<com.google.android.youtube.player.YouTubePlayerView
    android:id="@+id/youtube_view"
    android:layout_width="match_parent"
    android:layout_height="@dimen/_250Cdp" />

<TextView
    android:id="@+id/activity_you_tube_tv_close"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/_100dp"
    android:padding="@dimen/_5Ddp"
    android:text="@string/close"
    android:textColor="@color/white"
    android:textSize="@dimen/_18Csp"
    app:font_name="@string/font_roboto_light" />