You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android YouTube Player横竖屏切换时崩溃问题求助

解决方案:横竖屏切换后YouTubePlayer空指针问题

问题根源

横竖屏切换时Android会默认销毁并重建Activity,原有的mYouTubePlayer实例会被回收,切回竖屏后调用它的loadVideo方法就会触发空指针异常。

具体修复步骤

  1. 保存播放状态与视频ID
    在Activity中重写onSaveInstanceState方法,把当前播放的视频ID、播放进度等状态保存到Bundle中:

    private String mCurrentVideoId; // 新增变量记录当前播放视频ID
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mYouTubePlayer != null) {
            // 保存当前播放位置
            outState.putInt("current_position", mYouTubePlayer.getCurrentTimeMillis());
            // 保存当前播放的视频ID
            outState.putString("video_id", mCurrentVideoId);
        }
    }
    
  2. 完善YouTubePlayer初始化逻辑
    补全youTubePlayerSetup方法,确保初始化成功时保存YouTubePlayer实例,并在Activity重建时自动恢复播放状态:

    private void youTubePlayerSetup() {
        mYouTubePlayerView = findViewById(R.id.youtube_player);
        mOnInitializedListener = new YouTubePlayer.OnInitializedListener() {
            @Override
            public void onInitializationSuccess(YouTubePlayer.Provider provider, YouTubePlayer youTubePlayer, boolean wasRestored) {
                mYouTubePlayer = youTubePlayer;
                // 开启全屏方向控制适配
                youTubePlayer.setFullscreenControlFlags(YouTubePlayer.FULLSCREEN_FLAG_CONTROL_ORIENTATION);
                
                // 恢复之前的播放状态
                if (savedInstanceState != null && savedInstanceState.containsKey("video_id")) {
                    mCurrentVideoId = savedInstanceState.getString("video_id");
                    int position = savedInstanceState.getInt("current_position");
                    youTubePlayer.loadVideo(mCurrentVideoId, position);
                } else if (!wasRestored && mCurrentVideoId != null) {
                    youTubePlayer.loadVideo(mCurrentVideoId);
                }
            }
    
            @Override
            public void onInitializationFailure(YouTubePlayer.Provider provider, YouTubeInitializationResult youTubeInitializationResult) {
                Toast.makeText(SecondScreenActivity.this, "播放器初始化失败", Toast.LENGTH_SHORT).show();
            }
        };
        // 替换为你的YouTube Data API密钥
        mYouTubePlayerView.initialize("YOUR_API_KEY", mOnInitializedListener);
    }
    
  3. 调整Activity onCreate逻辑
    在onCreate中先获取传入的视频ID(如果是从其他页面跳转),再初始化播放器:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_secondscreen);
    
        // 获取跳转时传入的视频ID
        if (getIntent().getExtras() != null) {
            mCurrentVideoId = getIntent().getStringExtra("video_id");
        }
    
        youTubePlayerSetup();
    
        getDataFromAPI(new VolleyCallback() {
            @Override
            public void onSuccess(JSONArray result){
                loadingPB.setVisibility(View.GONE);
                Toast.makeText(getApplicationContext(), "SUCCESS",Toast.LENGTH_LONG).show();
            }
        });
    
        userModalArrayList = new ArrayList<>();
        userRV = findViewById(R.id.idRVUsers);
    }
    
  4. 可选:禁止Activity重建(不推荐)
    如果不需要横竖屏布局适配,可以在AndroidManifest.xml中给该Activity添加配置,避免重建:

    <activity
        android:name=".SecondScreenActivity"
        android:configChanges="orientation|screenSize|screenLayout">
    </activity>
    

    这种方式简单粗暴,但会丢失系统默认的横竖屏布局切换能力,仅适合场景简单的页面。

关键注意事项

  • 必须在初始化成功的回调中保存YouTubePlayer实例,不能直接在onCreate中获取。
  • 确保mCurrentVideoId始终记录当前正在播放的视频ID,包括从API或跳转参数中获取的情况。
  • 初始化用的API密钥必须有效,且已在Google Cloud Console配置对应包名和SHA-1。

内容的提问来源于stack exchange,提问作者Asif Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:15