webView 全屏播放视频

亲测大坑,如有解决方法感谢指导我一下

这里实现的是对webview 中Video标签播放全屏视频的处理方式,目前腾讯视频的分享视频等无法做到全屏,网上看到很多使用js注入方式实现的全屏,我都一一做了试验,发现无效,比如腾讯视频分享链接使用的是iframe标签,这就导致一个问题,iframe标签下元素获取不到,因此获取不到全屏按钮,因此设置的点击事件毫无用处。并且该方法不能获取你点击的是哪个视频,在多视频时无用,唯一看到的有点用处的方法是使用jsoup去获取标签中的视频链接,但是腾讯之类的视频链接是加密的因此还是毫无作用。

 

第一点先是布局文件

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.lxy.webviewvideoplay.MainActivity">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content">
                <!-- 内容或者标题之类的区域,会被覆盖的区域-->

            </RelativeLayout>

            <WebView
                android:id="@+id/webView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

            </WebView>

        </LinearLayout>

        <RelativeLayout
            android:visibility="gone"
            android:id="@+id/rl_videoplay"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#000000">
            <!--全屏播放的布局区域,可自定义布局等 -->


        </RelativeLayout>
    </FrameLayout>

</LinearLayout>

二.关键部分代码 通过监听全屏事件,将视屏控件加入事先准备好的布局之中实现全屏效果

 

 

import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebResourceRequest;
import android.webkit.WebResourceResponse;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.RelativeLayout;

public class MainActivity extends AppCompatActivity {
    WebView webView;
    RelativeLayout relativeLayout;
    private  boolean isxCustomView=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        initData();
        initWebView("http://app1.yijin-game.com/#/information/detail?id=719");
    }
    void initView(){
        webView=findViewById(R.id.webView);
        relativeLayout=findViewById(R.id.rl_videoplay);
    }

    void initData(){

    }

    void initWebView(String url){
        webView.loadUrl(url);
        WebSettings ws = webView.getSettings();
        ws.setJavaScriptCanOpenWindowsAutomatically(true);
        ws.setPluginState(WebSettings.PluginState.ON);
        ws.setAllowFileAccess(true);
        ws.setLoadWithOverviewMode(true);
        ws.setBuiltInZoomControls(true);// 隐藏缩放按钮
        ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);// 排版适应屏幕
        ws.setUseWideViewPort(true);// 可任意比例缩放
        ws.setLoadWithOverviewMode(true);// setUseWideViewPort方法设置webview推荐使用的窗口。setLoadWithOverviewMode方法是设置webview加载的页面的模式。
        ws.setSavePassword(true);
        ws.setSaveFormData(true);// 保存表单数据
        ws.setJavaScriptEnabled(true);
        ws.setDomStorageEnabled(true);
        webView.setSaveEnabled(false);
        ws.setSaveFormData(false);
// 下面的一句话是必须的,必须要打开javaScript不然所做一切都是徒劳的
        ws.setJavaScriptEnabled(true);
        ws.setSupportZoom(false);
//setWebChromeClient主要处理解析,渲染网页等浏览器做的事情
//这个方法必须有,就算类中没有函数也可以,不然视频播放不了
        webView.setWebChromeClient(new xWebChromeClient());
//WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等
        webView.setWebViewClient(new xWebViewClientent());
    }
    /**
     * 视频全屏关键部分
     * 处理Javascript的对话框、网站图标、网站标题以及网页加载进度等
     * 需在配置文件中添加,切换横竖屏不重走生命周期,开启硬件加速
     *
     * @author
     */
    public class xWebChromeClient extends WebChromeClient {
        //进入全屏时会被调用
        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {//参数含义:播放视频的V,视频播放的回调
            if (isxCustomView){//判断是否处于全屏状态,是则退出
                callback.onCustomViewHidden();
                return;
            } //判断是否处于全屏状态,不是则进入
            isxCustomView=true;
            relativeLayout.addView(view);//将播放控件添加到布局的最上方
            relativeLayout.setVisibility(View.VISIBLE);
            webView.setVisibility(View.INVISIBLE);
        }
        // 视频播放退出全屏会被调用的
        @Override
        public void onHideCustomView() {
            if (!isxCustomView){
                return;
            }
            relativeLayout.removeAllViews();//移除所有控件
            relativeLayout.setVisibility(View.GONE);//隐藏播放布局
            webView.setVisibility(View.VISIBLE);//显示Webview
            isxCustomView=false;
        }
        // 视频加载时进程loading
        @Override
        public View getVideoLoadingProgressView() {

            return super.getVideoLoadingProgressView();
        }


    }
    @Override//关键部分 如果不写可能会出现退出界面视频仍在播放
    protected void onPause() {
        webView.reload();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            webView.onPause(); // 暂停网页中正在播放的视频
        }
        super.onPause();
    }

    public class xWebViewClientent extends WebViewClient {


        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view,url);

        }
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

            return super.shouldInterceptRequest(view, url);
        }
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, android.webkit.WebResourceRequest request) {


            return super.shouldInterceptRequest(view, request);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {


            return super.shouldOverrideUrlLoading(view, request);
        }

        @Override
        public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
            return super.shouldOverrideKeyEvent(view, event);
        }
    }
}

 

 

 

 

demo项目地址 https://github.com/IHoveYou/webviewvideoplay

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值