Android WebView 视频播放,全屏按钮不显示或灰显解决方案

  • 背景
  • 问题定位

背景

在Android开发中,遇到了如下问题:Activity内嵌WebView,加载有视频的页面时,视频无法全屏播放。全屏按钮不显示或者灰显。


故记录一下此次问题解决过程。

问题定位

在Android官方文档上对问题所述场景有如下解释:

其大意为:

1. 要打开硬件加速
2. 设置 WebChromeClient ,并实现 onShowCustomView() 方法和onHideCustomView()方法。
3. 要支持全屏

查看代码,并没有打开硬件加速,且WebChromeClient 虽然设置了,但是没有实现onShowCustomView() 方法和onHideCustomView()方法。关于第三点全屏,暂时没有看懂。
我们先修改前两点:

  1. 打开硬件加速:在Manifest中,对应的Activity添加android:hardwareAccelerated = "true"
  2. Activity中,对WebView进行如下设置:
//添加浏览器代理mWvContent.setWebChromeClient(new WebChromeClient() {······@Overridepublic void onShowCustomView(View view, CustomViewCallback callback) {super.onShowCustomView(view, callback);}@Overridepublic void onHideCustomView() {super.onHideCustomView();}});

设置好后,满心欢喜的运行,全屏按钮出来啦!然而点击之后,依然无法播放···

好吧,继续定位。我们已经确认,官方对h5视频的适配要求中,前两条我们已经满足了,唯有第三条还没有满足。在查阅资料后,发现WebView在点击全屏按钮后,会调用onShowCustomView方法。而全屏的视频会在其参数View view中进行渲染。所以我们需要在Activity中写一个容器,在onShowCustomView触发后,将其view传入该容器,且使APP横屏,容器全屏显示。
接下来修改代码:
布局修改(fl_video为新增的容器,用于全屏时展示):

    <RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/fl_video"android:layout_width="match_parent"android:layout_height="match_parent"android:visibility="gone" /><WebViewandroid:id="@+id/wv_content"android:layout_width="match_parent"android:layout_height="match_parent" /></RelativeLayout>

重新实现onShowCustomView与onHideCustomView(mCustomView ):

    private FrameLayout mLayout;    // 用来显示视频的布局private View mCustomView;    //用于全屏渲染视频的Viewprivate WebChromeClient.CustomViewCallback mCustomViewCallback;······mLayout = findViewById(R.id.fl_video);
            @Overridepublic void onShowCustomView(View view, CustomViewCallback callback) {super.onShowCustomView(view, callback);//如果view 已经存在,则隐藏if (mCustomView != null) {callback.onCustomViewHidden();return;}mCustomView = view;mCustomView.setVisibility(View.VISIBLE);mCustomViewCallback = callback;mLayout.addView(mCustomView);mLayout.setVisibility(View.VISIBLE);mLayout.bringToFront();//设置横屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}@Overridepublic void onHideCustomView() {super.onHideCustomView();if (mCustomView == null) {return;}mCustomView.setVisibility(View.GONE);mLayout.removeView(mCustomView);mCustomView = null;mLayout.setVisibility(View.GONE);try {mCustomViewCallback.onCustomViewHidden();} catch (Exception e) {}
//                titleView.setVisibility(View.VISIBLE);setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏}

接下来Manifest中配置横竖屏切换不走onCreate,防止h5重新加载:
manifest:android:configChanges="keyboardHidden|orientation|screenSize"
Activity横竖屏切换进行UI的调整:

    /*** 横竖屏切换监听*/@Overridepublic void onConfigurationChanged(Configuration config) {super.onConfigurationChanged(config);switch (config.orientation) {case Configuration.ORIENTATION_LANDSCAPE:getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);mToolbar.setVisibility(View.GONE);break;case Configuration.ORIENTATION_PORTRAIT:getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);getWindow().addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);mToolbar.setVisibility(View.VISIBLE);break;}}

调试代码,全屏功能OK。

注意:
在Actiity销毁的时候一定要销毁WebView,否则会造成WebView中的视频在Activity销毁后继续播放:

    @Overrideprotected void onDestroy() {super.onDestroy();//清空所有cookieCookieSyncManager.createInstance(WebActivity.this);CookieManager cookieManager = CookieManager.getInstance();cookieManager.removeAllCookie();CookieSyncManager.getInstance().sync();mWvContent.setWebChromeClient(null);mWvContent.setWebViewClient(null);mWvContent.getSettings().setJavaScriptEnabled(false);mWvContent.clearCache(true);mWvContent.destroy();}

Android WebView 视频播放,全屏按钮不显示或灰显解决方案相关推荐

  1. android应用点全屏按钮无法全屏,安卓手机软件显示不全屏的解决办法

    不知道大家有没有遇到这样的情况,当我们使用一些分辨率较高的安卓手机,有时候会发现很多网页以及软件等界面全屏显示.面对这样的问题,传统的解决办法无外乎两种,其一为使用Spare Parts的兼容模式来实 ...

  2. WebView 视频播放,全屏按钮显示不出来,全屏后不能播放视频

    最近项目的一个需求,需要在Webview 里面播放视频遇到了一些问题: 视频可以正常播放但是,视频底部的全屏按钮没了,只有一个音量按钮.修改后,点击全屏,视频不能播放. 接下来一 一解决: 问题1 : ...

  3. Android 节操视频播放器jiecaovideoplayer自定义播放音频使用:屏蔽全屏按钮,增加倒计时,当前时间/总时间

    一.屏蔽全屏按钮 找到JCVideoPlayerStandard.java文件中的代码: private void fixAudio() {if (SrcType.equalsIgnoreCase(& ...

  4. android华为手机全屏显示

    解决android华为提示全屏显示 最近发现很多应用在第一次安装之后,都会提示一个 [ 全屏显示] .一看,好像也没啥,但是对开发应用的开发者来说.感觉被打了一巴掌一样.自己好好编码完成的应用.出来个 ...

  5. 控制 video 标签的控制栏组件(隐藏、显示进度条、播放按钮、全屏按钮等)

    当 video 标签添加上 controls 属性时,页面上会显示出所有的控制组件.若有些组件不需要只需要在css中设置相关属性把它隐藏掉即可. <video controls></ ...

  6. 解决android华为提示全屏显示

    原文https://blog.csdn.net/xu_coding/article/details/82889782 解决android华为提示全屏显示 最近发现很多应用在第一次安装之后,都会提示一个 ...

  7. CSS_控制 video 标签的控制栏组件(隐藏、显示进度条、播放按钮、全屏按钮等)

    当 video 标签添加上 controls 属性时,页面上会显示出所有的控制组件.若有些组件不需要只需要在css中设置相关属性把它隐藏掉即可. <video controls></ ...

  8. Android studio中全屏显示

    android中设置全屏显示的方法## 标题 在MainActivity中添加如下代码 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FUL ...

  9. H5案例分享:微信视频播放全屏问题

    2019独角兽企业重金招聘Python工程师标准>>> 微信视频播放全屏问题 在ios和安卓手机里的微信下播放视频时,会遇到不少问题,例如需要手动点击,视频才会播放,并且视频会跳出微 ...

最新文章

  1. Java后端进行经纬度点抽稀聚合,HTML呈现及前端聚合实现点聚合~
  2. mac或者linux磁力下载方法:远离渣雷
  3. 智能设备逆向工程之外部Flash读取与分析篇
  4. 动手学深度学习(PyTorch实现)(四)--梯度消失与梯度爆炸
  5. 开课吧9.9元学python靠谱吗-9月程序员工资出炉,女朋友嫌我薪资要少了
  6. SparkSQL实践
  7. windows的终端命令
  8. 专科计算机毕业论文范文 致谢,大专毕业设计致谢模板(精选范文3篇)
  9. html如何调图片透明度,改变图片的透明度.html
  10. ubuntu 安装python mysqldb
  11. 华为手机通过ADB永久关闭系统更新
  12. 如何设计签名 我的名字
  13. 监控系统存储服务器和磁盘阵列,浅谈磁盘阵列如何应用于监控储存领域
  14. linux系列之-磁盘空间不足怎么办,磁盘清理方法
  15. Mybatis搞两下(sqlsession,动态代理)
  16. 4.四大类(DDL、DML、DQL、DCL)
  17. zha男/女的三种境界
  18. 局域网下载控制好帮手--超级嗅探狗
  19. Pandas-高级处理(七):透视表(pivot_table)【以指定列作为行索引对另一指定列的值进行分组聚合操作】、交叉表(crosstab)【统计频率】
  20. vue框架前后端联调流程

热门文章

  1. IIC驱动0.96寸OLED屏幕显示(51单片机)
  2. SpriteKit从零开始~Physics and Collisions
  3. XML(1)——shema约束之命名空间
  4. 第七章 突变和随机化
  5. 重视论文降重,应对论文查重
  6. win10查看电池损耗
  7. 浙江大学计算机学院 金小刚,金小刚-虚拟现实与交互技术研究院
  8. 文小刚:量子革命是最不可思议的物理革命
  9. 手机、浏览器的分辨率、状态栏参数
  10. 量子计算机意识永生,量子计算机如何使未来的人类永生