Android应用VideoView全屏图标点击报错求助(附代码日志)
问题排查与修复方案
看了你的代码和报错日志,很明显崩溃的原因是点击全屏按钮重新启动DetailsActivity时,没有传递视频链接(movie_links)等必要参数,导致新启动的Activity获取不到视频地址,调用Uri.parse(vidAddress)时触发了NullPointerException: uriString。
为什么会出现这个问题?
在FullScreenMediaController的全屏按钮点击事件里,你只给新的Intent添加了fullScreenInd参数,完全没把原Activity里的视频链接、电影名称、描述这些关键数据传过去。新的DetailsActivity启动后,intent.getStringExtra("movie_links")拿到的是null,自然就崩了。
快速修复方案
修改FullScreenMediaController中的点击事件代码,把原Activity的所有参数都复制到新的Intent里,再覆盖全屏状态参数:
fullScreen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Activity currentActivity = (Activity) getContext(); Intent intent = new Intent(currentActivity, DetailsActivity.class); // 复制原Intent中的所有参数,避免丢失视频链接、电影信息等数据 intent.putExtras(currentActivity.getIntent().getExtras()); // 更新全屏状态参数 if("y".equals(isFullScreen)){ intent.putExtra("fullScreenInd", ""); }else{ intent.putExtra("fullScreenInd", "y"); } currentActivity.startActivity(intent); currentActivity.finish(); // 关闭当前页面,避免栈里堆积多个相同Activity实例 } });
额外优化建议
- 添加非空判断:在
DetailsActivity里对视频链接做非空校验,防止意外崩溃:
String vidAddress = intent.getStringExtra("movie_links"); if (vidAddress == null || vidAddress.trim().isEmpty()) { Log.e(TAG, "视频链接为空,无法播放"); // 这里可以给用户显示一个错误提示,比如Toast return; } Uri vidUri = Uri.parse(vidAddress); vidView.setVideoURI(vidUri);
- 更流畅的全屏切换方式:其实不需要重新启动Activity就能实现全屏,直接修改当前Activity的窗口状态和屏幕方向会更丝滑,还能避免参数传递的问题:
// 先导入ActivityInfo import android.content.pm.ActivityInfo; // 替换FullScreenMediaController中的点击事件代码 fullScreen.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Activity currentActivity = (Activity) getContext(); if("y".equals(isFullScreen)){ // 退出全屏:恢复状态栏、显示ActionBar、切回竖屏 currentActivity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if(currentActivity.getSupportActionBar() != null){ currentActivity.getSupportActionBar().show(); } currentActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); fullScreen.setImageResource(R.drawable.fullscreen); isFullScreen = ""; }else{ // 进入全屏:隐藏状态栏、隐藏ActionBar、切回横屏 currentActivity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); if(currentActivity.getSupportActionBar() != null){ currentActivity.getSupportActionBar().hide(); } currentActivity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); fullScreen.setImageResource(R.drawable.fullscreenexit); isFullScreen = "y"; } } });
这种方式不需要重启Activity,用户体验更好,也从根源上避免了参数丢失的问题。
内容的提问来源于stack exchange,提问作者ZKhan
相关产品推荐
相关产品推荐

