Android解决部分机型WebView播放视频全屏按钮灰色无法点击、点击全屏白屏无法播放等问题
一、场景描述
在Android混合开发中Html中可以播放视频,视频播放采用<Video>标签。视频可以全屏播放。
用这种方式播放视频在大部分机型下没啥问题,但是有部分机型全屏播放时会出现全屏按钮灰色不可点击或者点击全屏按钮直接白屏等问题。
解决方法也比较简单,分如下三步:
二、解决办法
第一步:
给WebView对应的Activity设置硬件加速。ps:此处是解决全屏按钮灰色不可点击或者全屏按钮出不来等问题
在AndroidManifest.xml中的对应的Activity中设置android:hardwareAccelerated = "true"
<activity android:name=".ui.h5.activity.WebViewActivity" android:screenOrientation="portrait" android:hardwareAccelerated = "true"/>
第二步:
在Activity或者Fragment中的WebView设置之前加上下面的代码:
1 2 | getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); |
第三步:
设置WebView的WebChromeClient回调函数。并重写onShowCustomView和onHideCustomView。然后在这个两个方法中加入全屏展示和取消全屏展示时的相关代码。ps:点击全屏按钮会回调onshowCustomView点击取消全屏会调用onHideCustomView。具体代码如下所示:
//全局变量
private View mCustomView; //用于全屏渲染视频的View private IX5WebChromeClient.CustomViewCallback mCustomViewCallback;
//相关重写代码
mWebView.setWebChromeClient(new CustomJsWebChromeClient() { /** * 解决WebView播放视频点击全屏按钮白屏的问题。 * ps:如果去掉则部分机型视频全屏展示时有问题 */ @Override public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback customViewCallback) { super.onShowCustomView(view, customViewCallback); if (mCustomViewCallback != null) { mCustomViewCallback.onCustomViewHidden(); mCustomViewCallback = null; return; } getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); ViewGroup parent = (ViewGroup) mWebView.getParent().getParent(); parent.setVisibility(View.GONE); ((ViewGroup) parent.getParent()).addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mCustomView = view; mCustomViewCallback = customViewCallback; } /** * 解决WebView播放视频点击全屏按钮白屏的问题。 * ps:如果去掉则部分机型视频全屏展示时有问题 */ @Override public void onHideCustomView() { super.onHideCustomView(); if (mCustomView != null) { if (mCustomViewCallback != null) { mCustomViewCallback.onCustomViewHidden(); mCustomViewCallback = null; } getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (mCustomView != null && mCustomView.getParent() != null) { ViewGroup parent = (ViewGroup) mCustomView.getParent(); parent.removeView(mCustomView); if (mWebView.getParent().getParent() != null) { ViewGroup parent2 = (ViewGroup) mWebView.getParent().getParent(); parent2.setVisibility(View.VISIBLE); } } mCustomView = null; } } }
//到此就结束了,大家不用关注setWebChromeClient的回调函数用的是不是Android原生的,重点关注回调函数中如上的两个回调方法就行了,不用做改动,直接copy就可以。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探