【问题标题】:Android: How to properly initialize YouTube Player inside activity?Android:如何在活动中正确初始化 YouTube 播放器?
【发布时间】:2016-01-01 23:16:11
【问题描述】:

我正在尝试在活动中启动 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) 

【问题讨论】:

  • 您发现问题所在了吗?

标签: android exception youtube initialization


【解决方案1】:

我现在在我的应用程序中也面临这个错误。当用户在未正确初始化的情况下退出包含活动的 Youtube 播放器片段时,就会出现问题。它非常随机,不容易复制。

我只是使用 try-catch 来避免它,幸运的是,它还没有被复制。

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

再说一遍,这可能不是可靠的解决方案。

一种解决方案可能是检查OnBackPressed() youtube 播放器是否已初始化。

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

这里是link 发布此错误的跟踪器。

【讨论】:

  • 抱歉,我不明白您试图通过使用 isInitializationComplete 得到什么。如果初始化未完成,则在 onBackPressed 处返回。但是如果成功完成了呢? onBackPressed 中的“返回”有什么变化?
  • 是的,它似乎发生在用户关闭活动但 youtube 播放器尚未初始化时。我在使用旧设备时仅遇到过一次此异常,但我在 Google Console 或 Crashlytics 中收到了很多报告
  • fragment不能包含activity,activity包含fragment
【解决方案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);
            }
        }
    });
}

在您的活动中,在 layout.xml 中提供一个 youtube 片段,并在 onCreate 中进行以下替换:

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

这个帖子很相似并且帮助了我:

Initializing YouTube player in Fragment

这也很有帮助: Struggling with Youtube Player Support Fragment

【讨论】:

  • 我的问题有所不同,我将在下面发布我的答案:) 但也感谢您的回答:)
【解决方案3】:

经过一番挖掘,我发现了我的问题。问题出在我使用的 youtube 库上。它已经过时了,HERE 一切都很好:)

【讨论】:

  • 使用 Youtube Android Api 1.2.2 时,我仍然会发生此错误。你找到解决方案了吗?
  • 是的,@user5035668 错误仍然存​​在于您的 tube api 1.2.2 中。请看一下这个issuetracker.google.com/issues/35175333
【解决方案4】:

试试这个方法

这里的 Activity 是从 YouTubeBaseActivity 扩展而来的,它将出现在 YouTubeAndroidPlayerApi.jar 中。此活动还包含一些初始化侦听器方法来了解 youtube 播放器的状态。和follow this example for more help

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】:

    这对我有用

    请从here下载.Jar

    在你的 bins 文件夹中添加 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" />
    

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2015-05-21
      • 2013-03-05
      • 2021-01-16
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多