You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android WebView视频全屏问题求助:无全屏按钮且无法正常全屏

嘿,我来帮你搞定WebView里视频全屏的问题!你说看不到全屏按钮、没法全屏,还试过StackOverflow的方案没解决,那大概率是配置没做全,尤其是WebChromeClient的全屏回调没处理好,我一步步给你捋清楚:

一、先把WebView的基础配置拉满

网页的全屏按钮和视频播放依赖不少WebSettings设置,先检查这些有没有加:

  • 必须开启JavaScript:网页的全屏逻辑基本靠JS驱动,webSettings.setJavaScriptEnabled(true);
  • 开启DOM存储:部分视频网站需要这个来保存播放状态,webSettings.setDomStorageEnabled(true);
  • 允许媒体自动播放(可选但优化体验):webSettings.setMediaPlaybackRequiresUserGesture(false);
  • 旧版WebView可以试试开启插件支持:webSettings.setPluginState(WebSettings.PluginState.ON);
二、核心:实现WebChromeClient的全屏回调

这是解决问题的关键!WebView不会自动处理网页的全屏请求,必须重写WebChromeClient的几个方法,不然全屏按钮会被隐藏,请求也会被忽略:

首先在你的Activity里定义几个全局变量:

private View mCustomView;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
private FrameLayout mFullscreenContainer;

然后给WebView设置自定义的WebChromeClient:

webView.setWebChromeClient(new WebChromeClient() {
    // 网页请求全屏时触发
    @Override
    public void onShowCustomView(View view, CustomViewCallback callback) {
        super.onShowCustomView(view, callback);
        // 如果已有全屏视图,先销毁旧的
        if (mCustomView != null) {
            callback.onCustomViewHidden();
            return;
        }
        // 保存当前视图和回调
        mCustomView = view;
        mCustomViewCallback = callback;
        // 隐藏原布局里的WebView和其他UI(比如你的NavigationView、标题栏)
        webView.setVisibility(View.GONE);
        navigationView.setVisibility(View.GONE);
        if (getSupportActionBar() != null) getSupportActionBar().hide();
        // 创建全屏容器并添加视频视图
        mFullscreenContainer = new FrameLayout(MainActivity.this);
        mFullscreenContainer.addView(view);
        setContentView(mFullscreenContainer);
        // 开启系统全屏模式
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    // 网页退出全屏时触发
    @Override
    public void onHideCustomView() {
        super.onHideCustomView();
        if (mCustomView == null) return;
        // 清理全屏视图
        mCustomView.setVisibility(View.GONE);
        mFullscreenContainer.removeView(mCustomView);
        mCustomView = null;
        mCustomViewCallback.onCustomViewHidden();
        // 恢复原Activity布局
        setContentView(R.layout.your_activity_layout); // 替换成你自己的Activity布局ID
        webView.setVisibility(View.VISIBLE);
        navigationView.setVisibility(View.VISIBLE);
        if (getSupportActionBar() != null) getSupportActionBar().show();
        // 关闭系统全屏模式
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    // 这个方法一定要重写!返回true才能让网页显示全屏按钮
    @Override
    public boolean onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {
        return onShowCustomView(view, callback);
    }
});
三、处理返回键,避免全屏时直接退出应用

你已经有双击返回的逻辑,需要加个判断:如果当前处于全屏状态,先退出全屏再处理返回:

@Override
public void onBackPressed() {
    // 优先处理全屏退出
    if (mCustomView != null) {
        webView.getWebChromeClient().onHideCustomView();
    } else {
        // 保留你原来的双击返回逻辑
        if (doubleBackToExitPressedOnce) {
            super.onBackPressed();
            return;
        }
        this.doubleBackToExitPressedOnce = true;
        Toast.makeText(this, "再按一次退出应用", Toast.LENGTH_SHORT).show();
        new Handler().postDelayed(() -> doubleBackToExitPressedOnce = false, 2000);
    }
}
四、检查Manifest的补充配置

你已经加了android:hardwareAccelerated="true",还要补充这些:

  • 允许Activity横竖屏切换,避免全屏时布局异常:android:screenOrientation="sensor"
  • 加上配置变更监听,防止Activity重建:
<activity
    android:name=".MainActivity"
    android:configChanges="orientation|screenSize|keyboardHidden"
    android:hardwareAccelerated="true"
    android:allowBackup="true">
</activity>
五、额外排查小技巧
  • 清除WebView缓存:有时候网页缓存会导致按钮不显示,调用webView.clearCache(true); webView.clearHistory();试试
  • 测试不同视频网站:比如YouTube、B站,排查是不是特定网站的兼容问题
  • Android 10+可以检查下是否有媒体投影权限(不过WebView一般不需要,但特殊网站可以试试)

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

火山引擎 最新活动