Android YouTube Player横竖屏切换时崩溃问题求助
解决方案:横竖屏切换后YouTubePlayer空指针问题
问题根源
横竖屏切换时Android会默认销毁并重建Activity,原有的mYouTubePlayer实例会被回收,切回竖屏后调用它的loadVideo方法就会触发空指针异常。
具体修复步骤
保存播放状态与视频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); } }完善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); }调整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); }可选:禁止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
相关产品推荐
相关产品推荐

