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

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实例
    }
});

额外优化建议

  1. 添加非空判断:在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);
  1. 更流畅的全屏切换方式:其实不需要重新启动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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:34:20