大家都不知道原生的WebView 存在各种坑。各种适配问题。

最近在使用,总会出现DNS被拦截的情况。预览了各个大神的论坛与博客。

发现可以更改WebView内核。找到了比较火的两个。

分别是:腾讯X5内核 和 crosswalk

crosswalk : 据说很强大,但缺点就是会让你的APK包增大很多。(我还没试过,都是看大神们的博客说的)

大家可以参考这篇文章 如何轻松搞定Crosswalk之嵌入模式

相对crosswalk呢,腾讯X5 比较适合我目前的项目。至少包不会一下子给我 增大那么多

TBS腾讯浏览服务(点击跳转官网)

腾讯X5的好处我就不再说了,官网解释的肯定比我到位,我怎么做的吧。

第一步:那肯定是下载官方的SDK 包啦(腾讯浏览服务-SDK下载) 我这里下载的是上面这个

第二步:根据SDK 提供的jar包和so 包拷贝到自己的项目下。

(注意:我这里和官方提供的so,放的位置可能有点区别,这个就需要看的项目情况了)

注意:x5暂时不提供64位so文件,为了保证64位手机能正常加载x5内核,请参照如下链接修改相关配置

腾讯浏览服务-开发者后台

官方的Demo ,so包是放在 src\main\jniLibs  下这个可以看一下官方包。就知道了

在Demo 中的build.gradle,中有说到 so 包的目录位置

第三步:接下来就开始被配置,初始化X5了,在APP的 Application 中 onCreate()  去初始化

    private void initX5() {QbSdk.setDownloadWithoutWifi(true);//x5内核初始化接口//搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。QbSdk.initX5Environment(getApplicationContext(),  new QbSdk.PreInitCallback() {@Overridepublic void onViewInitFinished(boolean arg0) {//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。Log.d("app", " onViewInitFinished is " + arg0);}@Overridepublic void onCoreInitFinished() {}});}

在清单文件中去添加

        <!-- 腾讯X5内核初始化 --><service android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"android:label="dexopt"android:process=":dexopt" />

第四步 :继承  com.tencent.smtt.sdk.WebView  自定义 WebView (这里根据自己的情况定义)

public class SimpleWebView extends com.tencent.smtt.sdk.WebView {public SimpleWebView(Context context) {super(context);init();}public SimpleWebView(Context context, AttributeSet attrs) {super(context, attrs);init();}public SimpleWebView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}@SuppressLint("SetJavaScriptEnabled")private void init() {WebSettings webSetting = this.getSettings();webSetting.setJavaScriptEnabled(true);webSetting.setJavaScriptCanOpenWindowsAutomatically(true);webSetting.setAllowFileAccess(true);webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);webSetting.setSupportZoom(true);webSetting.setBuiltInZoomControls(true);webSetting.setUseWideViewPort(true);webSetting.setSupportMultipleWindows(true);// webSetting.setLoadWithOverviewMode(true);webSetting.setAppCacheEnabled(true);// webSetting.setDatabaseEnabled(true);webSetting.setDomStorageEnabled(true);webSetting.setGeolocationEnabled(true);webSetting.setAppCacheMaxSize(Long.MAX_VALUE);// webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);// webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);this.setWebViewClient(new SimpleWebViewClient());this.setWebChromeClient(new WebChromeClient(){//这里可以设置进度条。但我是用另外一种@Overridepublic void onProgressChanged(WebView webView, int i) {super.onProgressChanged(webView, i);}});}public static class SimpleWebViewClient extends com.tencent.smtt.sdk.WebViewClient {private SimpleLoadingDialog loadingDialog;@Overridepublic com.tencent.smtt.export.external.interfaces.WebResourceResponse shouldInterceptRequest(com.tencent.smtt.sdk.WebView webView, String url) {//做广告拦截,ADFIlterTool 为广告拦截工具类if (!ADFilterTool.hasAd(webView.getContext(),url)){return super.shouldInterceptRequest(webView, url);}else {return new WebResourceResponse(null,null,null);}}/*** 防止加载网页时调起系统浏览器*/@Overridepublic boolean shouldOverrideUrlLoading(com.tencent.smtt.sdk.WebView webView, String url) {webView.loadUrl(url);return true;}//在开始的时候,开始loadingDialog@Overridepublic void onPageStarted(com.tencent.smtt.sdk.WebView webView, String s, Bitmap bitmap) {super.onPageStarted(webView, s, bitmap);try{loadingDialog = new SimpleLoadingDialog(webView.getContext(),true);loadingDialog.show();}catch (Exception e){}}//在页面加载结束的时候,关闭LoadingDialog@Overridepublic void onPageFinished(com.tencent.smtt.sdk.WebView webView, String s) {super.onPageFinished(webView, s);try {if (loadingDialog != null) {loadingDialog.dismiss();}} catch (Exception e) {}}@Overridepublic void onReceivedError(com.tencent.smtt.sdk.WebView webView, com.tencent.smtt.export.external.interfaces.WebResourceRequest webResourceRequest, com.tencent.smtt.export.external.interfaces.WebResourceError webResourceError) {super.onReceivedError(webView, webResourceRequest, webResourceError);}@Overridepublic void onReceivedSslError(com.tencent.smtt.sdk.WebView webView, com.tencent.smtt.export.external.interfaces.SslErrorHandler sslErrorHandler, com.tencent.smtt.export.external.interfaces.SslError sslError) {sslErrorHandler.proceed();}}
}

接下来就是使用了,和我们原生的webView 没什么区别啦。

    /*** 初始化webView*/@SuppressLint("SetJavaScriptEnabled")private void initDetailsH5() {webView.getSettings().setJavaScriptEnabled(true);webView.setWebViewClient(new SimpleWebView.SimpleWebViewClient(){@Overridepublic void onPageFinished(com.tencent.smtt.sdk.WebView webView, String url) {super.onPageFinished(webView, url);toolbarTitle.setText(webView.getTitle());//获取WebView 的标题,设置到toolbar中去}@Overridepublic boolean shouldOverrideUrlLoading(com.tencent.smtt.sdk.WebView webView, String url) {if (url.contains("Activity/")){...}else if (url.contains("Share")){...}else {webView.loadUrl(url);}return true;}});}
    /*** 监听系统返回键,判断WebView是否有上一级,有的话就返回WebView的上一级* 否则返回页面** @param keyCode* @param event* @return*/@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {if (webView != null && webView.canGoBack()) {webView.goBack();return true;} else {return super.onKeyDown(keyCode, event);}}return super.onKeyDown(keyCode, event);}

第五步:这里也根据需要添加吧。就是广告拦截了。广告库加多了的话,可能就会影响性能了。

(我觉的这种做法存在很大的问题,如果建议直接使用Https。就可以避免这个问题)

public class ADFilterTool {/*** 屏蔽广告的NoAdWebViewClient类** @param context* @param url* @return true 为广告链接,false 为正常连接*/public static boolean hasAd(Context context, String url) {Resources res = context.getResources();String[] adUrls = res.getStringArray(R.array.adBlockUrl);for (String adUrl : adUrls) {if (url.contains(adUrl)) {return true;}}return false;}
}

在 res \ vlaues 目录下创建 AdUrlString.xml

(注:广告库部分摘取 Android Webview广告过滤的实现)

<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="adBlockUrl"><item>ubmcmm.baidustatic.com</item><item>gss1.bdstatic.com/</item><item>cpro2.baidustatic.com</item><item>cpro.baidustatic.com</item><item>lianmeng.360.cn</item><item>nsclick.baidu.com</item><item>caclick.baidu.com/</item><item>jieaogd.com</item><item>publish-pic-cpu.baidu.com/</item><item>cpro.baidustatic.com/</item><item>hao61.net/</item><item>cpu.baidu.com/</item><item>pos.baidu.com</item><item>cbjs.baidu.com</item><item>cpro.baidu.com</item><item>images.sohu.com/cs/jsfile/js/c.js</item><item>union.sogou.com/</item><item>sogou.com/</item><item>5txs.cn/</item><item>liuzhi520.com/</item><item>yhzm.cc/</item><item>jieaogd.com</item><item>a.baidu.com</item><item>c.baidu.com</item><item>mlnbike.com</item><item>alipays://platformapi</item><item>alipay.com/</item><item>jieaogd.com</item><item>vipshop.com</item></string-array>
</resources>

接下来就是  CookieUtils  ,同步WebView 的Cookie。为什么要同步Cookie ,我这就不介绍啦。

可以看一下我另外一篇文章,会有比较详细的Cookie同步。Android H5 交互Cookie 同步登录状态

最后温馨提醒一下,如果没有添加权限,注意加一下权限噢~

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.READ_SETTINGS" /><uses-permission android:name="android.permission.WRITE_SETTINGS" /><uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><!-- 硬件加速对X5视频播放非常重要,建议开启 --><uses-permission android:name="android.permission.GET_TASKS" />

第六步:如果需要做适配兼容的需要配置以下配置

兼容视频播放:

1)享受页面视频的完整播放体验需要做如下声明:

页面的Activity需要声明 android:configChanges="orientation|screenSize|keyboardHidden"

2)视频为了避免闪屏和透明问题,需要如下设置

a)网页中的视频,上屏幕的时候,可能出现闪烁的情况,需要如下设置:Activity在onCreate时需要设置:

getWindow().setFormat(PixelFormat.TRANSLUCENT);//(这个对宿主没什么影响,建议声明)

b)在非硬绘手机和声明需要controller的网页上,视频切换全屏和全屏切换回页面内会出现视频窗口透明问题,需要如下设置

声明当前<item name="android:windowIsTranslucent">false</item>为不透明。特别说明:这个视各app情况所需,不强制需求,如果声明了,对体验更有利

c)以下接口禁止(直接或反射)调用,避免视频画面无法显示:

webview.setLayerType()webview.setDrawingCacheEnabled(true);

第七步:输入法设置

避免输入法界面弹出后遮挡输入光标的问题

方法一:在AndroidManifest.xml中设置

android:windowSoftInputMode="stateHidden|adjustResize"

方法二:在代码中动态设置:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

还有一些其他的配置信息 我这里就不在搬官方的介绍了。

混淆配置、APP自定义UA、Tbs视频播放器接入...等等。官方描述还是很清晰的

好啦,到这里就全部介绍完啦。希望对你帮助。

Android 抛弃原生WebView,使用腾讯X5内核、并加入广告拦截。相关推荐

  1. 简单的使用腾讯X5内核浏览器替代Android原生的WebView

    目录 简单的使用腾讯X5内核浏览器替代Android原生的WebView 第一步:X5官网下载SDK,引入到AndroidStudio中 第二步:如果是64位CPU手机,则需要引入一个so(liblb ...

  2. Android的WebView如何播放视频和全屏视频(腾讯X5内核)

    WebView如何播放视频和全屏视频 前言 1. 接入SDK 2. 具体场景和代码实现 3. 踩坑 3.1 android.system.ErrnoException: chmod failed: E ...

  3. android内核网络缓存,Android WebView cache 缓存 腾讯X5内核在线视频播放

    [实例简介] Android WebView cache 缓存 腾讯X5内核在线视频播放 [实例截图] [核心代码] Terry007 └── Terry007 ├── AndroidManifest ...

  4. android 腾讯x5内核 浏览器

    1.浏览器内核: 主流浏览器内核介绍(前端开发值得了解的浏览器内核历史) 浏览器内核历史介绍: 在android 4.4之前,浏览器用的还是webkit 在android 4.4之后,google就抛 ...

  5. x5内核 ajax base64,腾讯X5内核 WebView 实践篇

    基于腾讯 X5 内核的WebView开发: 1.onPageFinished 2.onProgressChanged() 3.合适的时机获取页面元素 业务需求是在 html 中注入 js脚本实现阅读模 ...

  6. Android 用腾讯X5内核加载 word ppt 先下载在加载。

    Android 用腾讯X5内核加载 word ppt  先下载在加载. 第一步 下载Sdk 导入项目  第二步 下载 pdf word到本地 1. 调用下载  DownloaderTask task ...

  7. 基于腾讯x5内核的精简版浏览器

    X5Browser github地址 https://github.com/iamlocky/X5Browser 基于腾讯x5内核的精简版浏览器 适用于需要单独的页面显示web内容,官方webview ...

  8. 腾讯x5加载本地html乱码,腾讯X5内核播放器遇到的问题

    最近在写一个和视频有关的项目,用到了腾讯x5内核的webview.利用webview调用本地js文件来播放视频.事情本身很顺利,但是在过程中遇到了一些小插曲,在此记录一下. 1.去除播放器中的广告 正 ...

  9. android webview第三方框架,Android 中使用第三方 WebView,腾讯X5浏览器

    由于Android自带的webview,在低于4.3的手机上面不支持socket,因此寻求其他的解决方案,第一次应用中尝试加入Crosswallk,应用的体积整整大了40M,倒是也可以正常使用,app ...

最新文章

  1. C++(九)——职工信息管理系统
  2. 一个没有收到任何Offer的应届生回想
  3. Java 代码完成删除文件、文件夹操作
  4. 妙趣横生的算法--二叉树
  5. 云服务器ecs搭建环境,ECS云服务器linux下搭建开发环境
  6. 全国计算机二级基础知识ppt,有关全国计算机二级基础知识.ppt
  7. 使用HttpClient MultipartEntityBuilder 上传文件,并解决中文文件名乱码问题
  8. hdu 1232 经典并查集应用
  9. 拖后腿了吗?工信部称8兆以上宽带占比44.4%
  10. php使用加密狗,加密狗使用方法
  11. redux中导入createStore中间有条线,解决方案及redux的使用。(react)
  12. jibx进行xml数据绑定的binging.xml配置
  13. 一个域名下面能搭建多个网站吗?
  14. Ubuntu-的前世今生
  15. php 微信token验证失败,php下微信token验证失败怎么办?
  16. 免费临时邮箱,一次性邮箱
  17. Linux下安装GitHub
  18. 留学人员入户佛山需要哪些材料
  19. XFS 存储核心技术详解
  20. 花2万块买的教程!Android技术功底不够如何去面试,大厂直通车!

热门文章

  1. 每个公司、每个社区,都需要不止一个“灵魂人物”。
  2. 关于将AAB转化为APK
  3. SMBus与I2C的区别
  4. 基于C语言设计的像素小鸟小游戏
  5. chrome html 打印预览,Chrome打印预览错误
  6. npm使用过程中的一些错误解决办法及npm常用命令
  7. 解决android studio编译的速度慢,安装apk过慢的问题
  8. 保卫萝卜迅玩版53关php,保卫萝卜迅玩版 28关 | 手游网游页游攻略大全
  9. 计算机网络笔记及思维导图(3)——数据链路层
  10. 回首十几年视频编解码之路