版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/EUEHEUEN/article/details/79414551
我们在使用Android原生WebView的时候总会遇到各种各样的兼容性问题,比如----遇到 <iframe>标签引入的视频链接的时候,发现无法全屏观看,这个时候就需要使用X5WebView了,还可以进行小窗播放。
本文Demo地址:http://download.csdn.net/download/eueheuen/10265354
GitHub地址:https://github.com/EUEHBin/Demo(欢迎Star)
下载官方SDK,按照官方文档引入,注意:x5暂时不提供64位so文件,为了保证64位手机能正常加载x5内核,请参照如下链接修改相关配置https://x5.tencent.com/tbs/technical.html#/detail/sdk/1/34cf1488-7dc2-41ca-a77f-0014112bcab7
在MyApp中初始化X5:(耗时,放在子线程)
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); //初始化 x5内核 new Thread(new Runnable() { @Override public void run() { QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() { @Override public void onCoreInitFinished() { } @Override public void onViewInitFinished(boolean b) { } }; QbSdk.initX5Environment(getApplicationContext(),cb); } }).start(); } }
有关X5的配置:
//WebView private void MyWeb(String url) { webView = (ProgressWebView) findViewById(R.id.wb); webView.setDrawingCacheEnabled(true); webChromeClient = new WebChromeClient(); webView.setWebChromeClient(webChromeClient); webSettings = webView.getSettings(); // 修改ua使得web端正确判断(加标识+++++++++++++++++++++++++++++++++++++++++++++++++++++) // String ua = webSettings.getUserAgentString(); // webSettings.setUserAgentString(ua + "这里是增加的标识"); // 网页内容的宽度是否可大于WebView控件的宽度 webSettings.setLoadWithOverviewMode(false); // 保存表单数据 webSettings.setSaveFormData(true); webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); //关闭webview中缓存 // 是否应该支持使用其屏幕缩放控件和手势缩放 webSettings.setSupportZoom(true); webSettings.setBuiltInZoomControls(true); //隐藏原生的缩放控件 webSettings.setDisplayZoomControls(false); webView.requestFocus(); //此句可使html表单可以接收键盘输入 webView.setFocusable(true); webSettings.setUseWideViewPort(true); webSettings.setSavePassword(true); webSettings.setGeolocationEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setJavaScriptEnabled(true); // 启动应用缓存 webSettings.setAppCacheEnabled(false); // 设置缓存模式 webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE); // 设置此属性,可任意比例缩放。 webSettings.setUseWideViewPort(true); webSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。 webSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放 // 页面加载好以后,再放开图片 //mSettings.setBlockNetworkImage(false); // 使用localStorage则必须打开 webSettings.setDomStorageEnabled(true); // 排版适应屏幕 webSettings.setLayoutAlgorithm(com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm.NARROW_COLUMNS); // WebView是否支持多个窗口。 webSettings.setSupportMultipleWindows(true); webSettings.setUseWideViewPort(true); // 关键点 webSettings.setAllowFileAccess(true); // 允许访问文件 //将图片调整到适合webview的大小 webSettings.setUseWideViewPort(true); // webview从5.0开始默认不允许混合模式,https中不能加载http资源,需要设置开启。 // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW); // } // 缩放至屏幕的大小 webSettings.setLoadWithOverviewMode(true); //其他细节操作 webSettings.setAllowFileAccess(true); //设置可以访问文件 webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口 webSettings.setLoadsImagesAutomatically(true); //支持自动加载图片 webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式 webSettings.setDomStorageEnabled(true);//JS在HTML里面设置了本地存储localStorage,java中使用localStorage则必须打开 webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setUseWideViewPort(true); //自适应屏幕 //以下接口禁止(直接或反射)调用,避免视频画面无法显示: //webView.setLayerType(); webView.setDrawingCacheEnabled(true); //去除QQ浏览器推广广告 getWindow().getDecorView().addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { ArrayList<View> outView = new ArrayList<View>(); getWindow().getDecorView().findViewsWithText(outView,"QQ浏览器",View.FIND_VIEWS_WITH_TEXT); if(outView.size()>0){ outView.get(0).setVisibility(View.GONE); } } }); webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView webView, String s) { webView.loadUrl(s); return true; } @Override public void onPageStarted(WebView webView, String s, Bitmap bitmap) { super.onPageStarted(webView, s, bitmap); } @Override public void onPageFinished(WebView webView, String s) { super.onPageFinished(webView, s); } @Override public void onReceivedError(WebView webView, int i, String s, String s1) { super.onReceivedError(webView, i, s, s1); } }); webView.loadUrl(url); }