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" />