Android WebView 总结 —— 使用HTML5播放视频及全屏方案

Android 8.0(Android O) 开启硬件加速 WebView 截取Bitmap 以上方法可在Android 8.0 系统上,webView开启硬件加速的场景下截取bitmap。使用上面代码截取webView时,如果不关闭硬件加速,截取的bitmap是空白的。记录一下这个小问题,希望对大家有所帮助。 阅读详情

在APP开发的过程中,会碰到需要在WebView中播放视频的需求,下面讲解一下如何在WebView中使用html5播放视频。

1.让视频在各个Android版本能够正常播放

在AndroidManifest.xml中声明HardwareAccelerate的标志,一般是添加在Activity的级别上。代码如下:
<activity ... android:hardwareAccelerated="true" >

下面引申一下HardwareAccelerate声明的方式:

(a).如果需要声明整个应用都要加速,则在Application级别下面进行声明:

< application ... android:hardwareAccelerated ="true">

(b).如果需要某个Activity加速,则可以进行下面的声明:

<activity ... android:hardwareAccelerated="true" >

或者在代码里面进行动态的声明:

getWindow.setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

(c).如果Application和Activity都声明了HardwareAccelerate,但是由于某些特殊原因,一些View不需要硬件加速,那么在View里面设置:

view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

完成声明操作后,基本上WebView就能够很好的支持在页面上播放视频了,下面展示的是在Html上的Viedeo的声明方法:

复制代码
<!DOCTYPE html>
<html>
    <body>
        <video width="305" height="305" controls="controls" preload="none" poster="http://****.png" >
              <source src="http://*****.mp4" type="video/mp4">
        </video>
    </body>
</html>
复制代码

2. 视频播放的时候能够全屏

视频能播放,那么如何支持视频全屏播放呢? 下面是针对全屏播放网页视频提供的解决办法:

复制代码
public class WebVideoActivity extends Activity {
  
    private WebView webView;

    /** 视频全屏参数 */
    protected static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    private View customView;
    private FrameLayout fullscreenContainer;
    private WebChromeClient.CustomViewCallback customViewCallback;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        setContentView(R.layout.activity_xx);
        webView = (WebView) findViewById(R.id.xx);
        initWebView();
    }

    @Override
    protected void onStop() {
        super.onStop();
        webView.reload();
    }

    /** 展示网页界面 **/
  public void initWebView() {
        WebChromeClient wvcc = new WebChromeClient();
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setUseWideViewPort(true); // 关键点
        webSettings.setAllowFileAccess(true); // 允许访问文件
        webSettings.setSupportZoom(true); // 支持缩放
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 不加载缓存内容

        webView.setWebChromeClient(wvcc);
        WebViewClient wvc = new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                webView.loadUrl(url);
                return true;
            }
        };
        webView.setWebViewClient(wvc);

        webView.setWebChromeClient(new WebChromeClient() {

            /*** 视频播放相关的方法 **/

            @Override
            public View getVideoLoadingProgressView() {
                FrameLayout frameLayout = new FrameLayout(WebVideoActivity.this);
                frameLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
                return frameLayout;
            }

            @Override
            public void onShowCustomView(View view, CustomViewCallback callback) {
                showCustomView(view, callback);
            }

            @Override
            public void onHideCustomView() {
                hideCustomView();
            }
        });

        // 加载Web地址
        webView.loadUrl(webUrl);
    }

    /** 视频播放全屏 **/
    private void showCustomView(View view, CustomViewCallback callback) {
        // if a view already exists then immediately terminate the new one
        if (customView != null) {
            callback.onCustomViewHidden();
            return;
        }

        WebVideoActivity.this.getWindow().getDecorView();

        FrameLayout decor = (FrameLayout) getWindow().getDecorView();
        fullscreenContainer = new FullscreenHolder(WebVideoActivity.this);
        fullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
        decor.addView(fullscreenContainer, COVER_SCREEN_PARAMS);
        customView = view;
        setStatusBarVisibility(false);
        customViewCallback = callback;
    }

    /** 隐藏视频全屏 */
    private void hideCustomView() {
        if (customView == null) {
            return;
        }

        setStatusBarVisibility(true);
        FrameLayout decor = (FrameLayout) getWindow().getDecorView();
        decor.removeView(fullscreenContainer);
        fullscreenContainer = null;
        customView = null;
        customViewCallback.onCustomViewHidden();
        webView.setVisibility(View.VISIBLE);
    }

    /** 全屏容器界面 */
    static class FullscreenHolder extends FrameLayout {

        public FullscreenHolder(Context ctx) {
            super(ctx);
            setBackgroundColor(ctx.getResources().getColor(android.R.color.black));
        }

        @Override
        public boolean onTouchEvent(MotionEvent evt) {
            return true;
        }
    }

    private void setStatusBarVisibility(boolean visible) {
        int flag = visible ? 0 : WindowManager.LayoutParams.FLAG_FULLSCREEN;
        getWindow().setFlags(flag, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        switch (keyCode) {
        case KeyEvent.KEYCODE_BACK:
            /** 回退键 事件处理 优先级:视频播放全屏-网页回退-关闭页面 */
            if (customView != null) {
                hideCustomView();
            } else if (webView.canGoBack()) {
                webView.goBack();
            } else {
                finish();
            }
            return true;
        default:
            return super.onKeyUp(keyCode, event);
        }
    }
}
复制代码

在onShowCustomView方法中,将获取到的view放到当前Activity的最上方,在onHideCustomView中,将之前的view隐藏或者删除,将原来被覆盖的webview放回来。

Android WebView视频播放全屏与硬件加速优化实践 本文深入探讨了Android WebView中视频播放的核心优化实践。针对常见的视频黑屏问题,详细解析了硬件加速的开启方式与层级控制。同时,系统阐述了通过WebChromeClient回调实现全屏播放的完整流程,并分享了后台声音管理、兼容性处理及内存优化等实战经验,助力开发者打造流畅稳定的WebView视频播放体验。 阅读详情

相关推荐

告别WebView视频播放坑:硬件加速、全屏切换与后台暂停的终极指南

本文深入探讨了Android WebView中视频播放的三大核心难题:硬件加速的正确开启与机型适配、无缝全屏切换的视图管理方案,以及后台暂停播放的JavaScript与生命周期联动策略。通过实战代码与原理分析,提供了一套系统性的解决方案,旨在帮助开发者彻底告别视频黑屏、全屏错乱和后台播放等问题,显著提升用户体验。

stone的博客 558

Android中的Webview 加载优化

Android中的Webview 加载优化

QYgujingjing的专栏 7914

Android WebView全屏播放HTML5视频实战项目

回顾整条链路,我们经历了:HTML5视频的基础配置与兼容性打磨JS与Java的安全通信模型构建全屏桥接的设计与实现多机型适配与异常兜底每一步都不是简单的API调用,而是对平台限制、用户体验、安全性、性能之间的反复权衡。但正是这种“在夹缝中求最优解”的过程,才构成了移动开发的魅力所在。💡下次当你看到那个小小的播放按钮时,不妨想想背后有多少工程师为此熬夜调试——也许你会对产品多一分敬畏,对技术多一分热爱 ❤️“优秀的播放器,从来不是让视频动起来那么简单。

weixin_28988985的博客 738

Android WebView Video完全详解(第一篇)-Android开发人员

转载请注明出处 http://blog.youkuaiyun.com/u014513456/article/details/54381361 Author:ruanjianjiagou@163.com 背景 最近公司某项功能需要WebView加载H5的Video,搜索很多资料后发现很多问题,都是关键代码片段,因为每个项目每个人产生的问题不同,Video在webview中加载不出来原因很多,可能是客户端少了参...

长江某菜鸟的博客 718

解决WebView中在线视频全屏播放问题的实战案例

在现代网页中,全屏API(Application Programming Interface)是一种让网页能够使用整个浏览器窗口而不显示地址栏、工具栏和其他浏览器界面元素的能力。这种功能在视频播放器、幻灯片展示、游戏和其他沉浸式内容中尤为重要。不过,由于全屏API相对较新,并且不同的浏览器厂商对于API的支持程度不一,开发者在实施时会面临兼容性挑战。为了解决兼容性问题,开发者需要检测浏览器是否支持全屏API,并在不支持的情况下提供替代方案。

weixin_32252929的博客 1276

Android WebView加载HTML5视频完整实现方案

对于高分辨率视频,务必启用 GPU 渲染:} else {但要注意:过度使用硬件加速可能导致内存飙升。建议在onDestroy中及时释放:很多人觉得 WebView 是个过渡方案,迟早会被原生播放器替代。但现实是:📈 越来越多的内容型 App(电商、社交、教育、新闻)依赖 WebView 承载动态化页面;🔁 H5 视频因其发布灵活、跨平台一致、SEO友好,依然是主流选择之一。所以,与其回避它,不如真正掌握它。

weixin_35649491的博客 1680

Android WebView 总结 —— 硬件加速使用HTML5播放视频及全屏方案

转自https://www.cnblogs.com/renhui/p/5893593.html 在APP开发的过程中,会碰到需要在WebView中播放视频的需求,下面讲解一下如何在WebView中使用html5播放视频。 1.让视频在各个Android版本能够正常播放 在AndroidManifest.xml中声明HardwareAccelerate的标志,一般是添加在A

5594

波分复用-Zblock仿真

Z-BLOCK是一种用于光通信模块的光学元件,其核心结构是在玻璃块一侧贴有4个特定波长滤光片,另一侧镀有反射膜和增透膜。光信号在内部呈现Z字形反射路径,实现波长分离。文章以可见光LED为例,在ZEMAX中演示了非序列模式下的建模过程,重点介绍了滤光片和膜层的参数设置方法。需要注意的是,入射角度需根据玻璃折射率、通道高度和厚度精确计算,否则可能导致光泄漏。该建模方法同样适用于光通信中的光纤激光器系统。

Zhaxibamao的博客 1743

MFC下使用C++操作Word文档

由于项目需求,在MFC环境下操作将数据和图片写入word文档,之前没有接触过,网上查阅了很多资料,终于把任务完成。理解的不是很透彻,但是这些东西应该够用了,写篇博客记录一下,以便以后再用到。 (1)VS环境下创建一个MFC应用程序,然后在项目上单击右键,选择 类向导-----添加类----类型库中的MFC类。在弹出的对话框中选择文件,位置选择office安装目录下的...

GIS_yuhua的博客 7577

【DAY11】超参数调整专题1

核心优势: 它不是随机选择下一个点,而是根据先前评估的结果建立一个概率模型(通常是高斯过程),预测哪些参数组合可能产生更好的结果,并据此选择下一个评估点。这使得它在寻找最优解方面通常比随机搜索更高效(用更少的迭代次数达到相似或更好的性能),特别是当模型训练(单次评估)非常耗时的时候。实际上,有着非常多的方式可以实现贝叶斯优化,上面的代码比较简洁美观,贝叶斯优化和网格搜索的代码书写风格高度一致。- 需要定义参数的搜索空间,与随机搜索类似,当搜索空间非常大时,它通常比网格搜索和随机搜索更有效。

daomingwu1的博客 747

webview 播放video 标签视频 可全屏播放代码

WebViewMovie01Activity.java public class WebViewMovie01Activity extends AppCompatActivity { /** * DEMO04: */ HTML5WebView mWebView; public String url = "http://zy.512wx.com/sh...

android开发笔记 575

利用绝对式编码器实现电机无限旋转的配置与优化

本文详细解析了如何利用绝对式编码器实现电机的无限旋转功能。通过切换驱动器编码器工作模式、精确计算逻辑位置范围等关键配置步骤,解决了传统方案在多圈计数溢出时的定位难题。该方案无需硬件改造,适用于大型回转台、连续供料系统等需要大范围连续绝对定位的自动化场景。

weixin_29184371的博客 239

webview html5 video,Android WebView html5 video force fullscreen

I have been working on this issue for at least one week. I have read all the post about it in StackOverflow but I still not founding the solution and I am starting to think that this is impossible.I w...

weixin_40007175的博客 275

STM32铅酸蓄电池内阻测试仪的交流阻抗测量与数据采集优化

本文深入探讨了基于STM32的铅酸蓄电池内阻测试仪设计,重点解析了交流阻抗测量原理与数据采集优化方案。通过采用1kHz交流小信号注入和数字相敏检波技术,实现对电池欧姆内阻的无损精准测量,并详细介绍了硬件前端调理、ADC过采样及系统标定等关键优化手段,有效提升了测量精度与稳定性。

weixin_29168393的博客 486

【JS】自定义上传组件,文件上传与回显,自定义进度条显示(基于element-plus与axios)

公司是做B 端产品的,有sass平台也有源码交付的项目,最近开发了很多小系统,这里记录一下开发遇到的问题。 需要定制一个上传组件,要求可以自定义文件存储路径,自定义可上传的文件类型,限制文件大小等,并且提供基础的文件回显功能,例如上传一张图片到服务器指定目录的`/file`文件夹下面,并且实现可以查看预览的功能。

余浩的博客 1161

VideoEnabledWebView与原生视频播放器对比:何时选择WebView HTML5视频方案

在Android应用开发中,实现视频播放功能时,开发者常常面临两种选择:使用原生视频播放器还是基于WebView的HTML5视频方案。**VideoEnabledWebView**作为一个专注于增强WebView视频播放能力的开源项目,为开发者提供了一种灵活且功能完整的HTML5视频解决方案。本文将深入对比这两种方案的优缺点,帮助你判断何时选择WebView HTML5视频方案更为合适。 ##

gitblog_00712的博客 478

SwinTransformer 改进:SSPCAB模块(2024最新改进方法)

SSPCAB(Spatial Pyramid Pooling with Channel Attention Block)是2024年提出的一种新型神经网络架构改进方法,专注于在保持高精度的同时显著降低计算复杂度和参数量。该方法通过创新的空间金字塔池化与通道注意力机制的结合,实现了网络结构的紧凑化和运算效率的大幅提升。核心创新点1. 混合空间金字塔池化(Hybrid Spatial Pyramid Pooling, HSPP)多尺度动态核池化:根据输入特征图尺寸动态调整池化核大小和步长交叉级联结构。

Henry的博客 1305

Android WebView 播放视频总结

今天发现 WebView里播放优酷的视频点击播放按钮后没反应,于是看官方文档和搜索解决,下面是我在别人基础上做的补充: android webView 无法播放视频,无法暂停,继续播放视频问题,无法根据浏览器居中显示内容问题 转自:http://blog.youkuaiyun.com/it_ladeng/article/details/8136534 此次遇到一个问题就是webView无

lwklan的专栏 603

瑞芯微RK3588/RK3576平台采集BT1120(fpga)驱动调试记录

本文介绍了在RK3576/RK3588平台上采集FPGA传输的BT1120数据的方法。主要内容包括:1)硬件连接需确认管脚复用和图像格式(通常为uyvy_2x8);2)设备树配置要点,如I2C总线设置、BT1120模式指定等;3)驱动适配注意事项,包括时钟极性、分辨率格式等关键参数;4)测试方法,通过media-ctl和v4l2-ctl工具验证数据采集。文中特别指出RK3576和RK3588配置的通用性,并提供了常见问题的排查思路。

bingdund的博客 913

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: python笔记(5)-面向对象编程
下一篇: 各系统hosts文件位置
MrCoderr
博客等级 码龄12年 39粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值