WebView播放视频的问题

WebView加载网页时,如果有视频的话,需要做一些特殊处理,今天碰到了一个网页上的视频,是网页加载完了自动播放的,不是那种网页上写了播放器然后有播放按钮可以点击播放的视频,在业务中的处理方法如下

首先把各位前辈讲的广谱代码都贴上,权限,硬件加速,旋转控制,都是Manifest里的

<uses-permission android:name="android.permission.INTERNET" />

        <activity
            android:name=".LJActivity"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:hardwareAccelerated="true" /> 
然后是代码逻辑里对于WebView的处理

public class LJActivity extends Activity {

    WebView mWebview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lj);
        mWebview = (WebView) findViewById(R.id.wv_lj);
        mWebview.setNetworkAvailable(true);
        //声明WebSettings子类
        WebSettings webSettings = mWebview.getSettings();

        //如果访问的页面中要与Javascript交互,则webview必须设置支持Javascript
        webSettings.setJavaScriptEnabled(true);

        //支持插件
        webSettings.setPluginState(WebSettings.PluginState.ON);
        //设置自适应屏幕,两者合用
        webSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

        //缩放操作
        webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
        webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
        webSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件

        //其他细节操作
        // 开启缓存
        webSettings.setAppCacheEnabled(true);// 应用可以有缓存
        webSettings.setDomStorageEnabled(true);// 设置可以使用localStorage
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);// 优先使用缓存
        webSettings.setAppCacheMaxSize(50 * 1024 * 1024);// 缓存最多可以有10M
        webSettings.setAllowFileAccess(true); //设置可以访问文件
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
/*        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }*/
        mWebview.setWebViewClient(new WebViewClient() {
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if( url.startsWith("http:") || url.startsWith("https:") ) {
                    return false;
                }

                try{

                    Intent intent =new Intent(Intent.ACTION_VIEW, Uri.parse(url));

                    startActivity( intent );

                }catch(Exception e){
                    e.printStackTrace();
                }
                return true;
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                mWebview.loadUrl("javascript:(function() { var videos = document.getElementsByTagName('video'); for(var i=0;i<videos.length;i++){videos[i].play();}})()");
            }
        });
        mWebview.setWebChromeClient(new WebChromeClient() {
            private View myView = null;
            @Override
            public void onShowCustomView(View view, CustomViewCallback callback) {
                super.onShowCustomView(view, callback);
                ViewGroup parent = (ViewGroup) mWebview.getParent();
                parent.removeView(mWebview);

                // 设置背景色为黑色
                view.setBackgroundColor(LJActivity.this.getResources().getColor(R.color.black));
                parent.addView(view);
                myView = view;

                setFullScreen();
            }
            // 退出全屏
            @Override
            public void onHideCustomView() {
                super.onHideCustomView();
                if (myView != null) {

                    ViewGroup parent = (ViewGroup) myView.getParent();
                    parent.removeView(myView);
                    parent.addView(mWebview);
                    myView = null;

//                    titleBar.setVisibility(View.VISIBLE);
                    quitFullScreen();
                }
            }
        });

        mWebview.loadUrl("http://51uuid.lancygroup.com/home.php/addon/WxSite/WxSite/index/shop_id/68264bdb65b97eeae6788aa3348e553c");
        ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
        // 将文本内容放到系统剪贴板里。
        cm.setText("http://51uuid.lancygroup.com/home.php/addon/WxSite/WxSite/index/shop_id/68264bdb65b97eeae6788aa3348e553c");
//        mWebview.loadUrl("http://ovarofyes.bkt.clouddn.com/01.mp4");
//        mWebview.loadUrl("https://51uuid.lancygroup.com:8099/home.php/addon/WxSite/WxSite/index/shop_id/68264bdb65b97eeae6788aa3348e553c");

    }
    /**
     * 设置全屏
     */
    private void setFullScreen() {
        // 设置全屏的相关属性,获取当前的屏幕状态,然后设置全屏
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
    }

    /**
     * 退出全屏
     */
    private void quitFullScreen() {
        // 声明当前屏幕状态的参数并获取
        final WindowManager.LayoutParams attrs = this.getWindow().getAttributes();
        attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
        this.getWindow().setAttributes(attrs);
        this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
    }
}

  1. WebSetting的相关设置
  2. WebViewClient的定义,此处主要是onPageFinished()方法,在此处要进行一个JS方法的加载,也就是为了应对视频本身没有播放按钮的情况,页面加载完了之后,自动加载页面上的video标签,找到页面上的视频并播放。
  3. WebChromeClient的定义,此处定义这个方法是为了全屏播放网页上的视频,当视频全屏播放被触发(onShowCustomView)时,将WebView从它的父View中拿掉,并且将播放视频的View加进去,最后设置屏幕状态是全屏,如果有父View不是全屏的可以在这里设置父View为全屏,再将其他无关View的Visibility都设为GONE; 当取消全屏(onHideCustomView)时,将播放视频的View拿掉,WebView放回去等等,做一些恢复现场的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值