随笔 - 632  文章 - 17  评论 - 54  阅读 - 93万

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就可以。

posted on   飘杨......  阅读(4834)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示