最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理。

比如,下面是一段html代码,嵌套这iframe标签,src就是跳转地址,我现在就要当你点击该网址的时候做拦截,自己做处理而不是跳转。

 

oh,我还是第一次知道iframe标签,不过想着应该和普通拦截h5差不多,兴致勃勃的就开始撸代码了,但是无论怎么配置WebView,还是重写 shouldOverrideUrlLoading ,就是拦截不了iframe里的网址。。。后来研(bai)究(du)了很久,终于拦截到了。

实现方法:

  首先,你的WebView要 setWebViewClient ,重写

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {} 方法,然后setWebChromeClient,重写onCreateWindow方法,在里面创建新的WevView,加入到webView里,给新的webView  setWebViewClient,再重写shouldVeerrideUrlLoading方法,在这里拦截。
        webView.setWebChromeClient(new WebChromeClient(){                        @Override            public boolean onCreateWindow(WebView webView, boolean isDialog, boolean isUserGesture, Message resultMsg) {                WebView newWebView = new WebView(getActivity());                webView.addView(newWebView);                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;                transport.setWebView(newWebView);                resultMsg.sendToTarget();                newWebView.setWebViewClient(new WebViewClient(){                    @Override                    public boolean shouldOverrideUrlLoading(WebView webView, String url) {                        //TODO 在这里实现你的拦截方法                        if (url.contains("https://www.imooc.com")){                            toast("拦截到了" + url);                            Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);                            intent.putExtra("url",url);                            startActivity(intent);                        }else {                            webView.loadUrl(url);                        }                        return true;                    }                });                return true;            }        });

 

完整的代码如下:

private void initWebView(WebView webView) {        //启用支持javascript        WebSettings settings = webView.getSettings();        settings.setJavaScriptEnabled(true);        settings.setJavaScriptCanOpenWindowsAutomatically(true);        settings.setSupportZoom(false); //支持缩放        settings.setBuiltInZoomControls(false); //支持手势缩放        settings.setDisplayZoomControls(false); //是否显示缩放按钮        settings.setDefaultTextEncodingName("utf-8"); //设置文本编码        settings.setUseWideViewPort(false); //将图片调整到适合WebView的大小        settings.setLoadWithOverviewMode(true); //自适应屏幕        settings.setDomStorageEnabled(true);        settings.setSaveFormData(true);        settings.setSupportMultipleWindows(true);        settings.setAppCacheEnabled(true);        settings.setPluginState(WebSettings.PluginState.ON);//支持插件        settings.setCacheMode(WebSettings.LOAD_NO_CACHE); //不适用缓存        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//支持内容重新布局        webView.setOverScrollMode(View.OVER_SCROLL_NEVER); // 取消WebView中滚动或拖动到顶部、底部时的阴影        webView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); // 取消滚动条白边效果        // >= 19(SDK4.4)启动硬件加速,否则启动软件加速        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);            settings.setLoadsImagesAutomatically(true); //支持自动加载图片        } else {            webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);            settings.setLoadsImagesAutomatically(false);        }        webView.setWebViewClient(new WebViewClient() {            @Override            public void onLoadResource(WebView view, String url) {                super.onLoadResource(view, url);                Log.w("webView==onLoadResource===url=" + url);            }            @Override            public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {                sslErrorHandler.proceed();  // 接受所有网站的证书            }            @Override            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {                              if (request.getUrl().toString().contains("http://www.baidu.com")){                    toast("拦截到了baidu");                                    }else {                    webView.loadUrl(request.getUrl().toString());                }                return true;            }        });        webView.setWebChromeClient(new WebChromeClient(){                     @Override            public boolean onCreateWindow(WebView webView, boolean isDialog, boolean isUserGesture, Message resultMsg) {                WebView newWebView = new WebView(getActivity());                webView.addView(newWebView);                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;                transport.setWebView(newWebView);                resultMsg.sendToTarget();                newWebView.setWebViewClient(new WebViewClient(){                    @Override                    public boolean shouldOverrideUrlLoading(WebView webView, String url) {                                                if (url.contains("http://www.imooc.com")){                            toast("拦截到了" + url);                            Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);                            intent.putExtra("url",url);                            startActivity(intent);                        }else {                            webView.loadUrl(url);                        }                        return true;                    }                });                return true;            }        });    }

 

参考文章:https://blog.csdn.net/qq498654921com/article/details/44815281

更多相关文章

  1. Android(安卓)兼容性 | 充分利用新款 Android(安卓)旗舰设备上更
  2. 关于Android(安卓)WebView不支持location.href打开的解决方法 小
  3. Android(安卓)CPU 架构详解
  4. 三星给中国电信定制的支持Android(安卓)2.0新机i899
  5. Android(安卓)多用户
  6. Android中矢量图形的那些事 - SVG or Vector
  7. Android(安卓)- 支持不同的设备 - 支持不同的屏幕
  8. 9个非常棒的Android代码编辑器 移动开发者的最爱
  9. android小记之自定义ImageView

随机推荐

  1. Android(安卓)ContentResolver使用说明
  2. 八款开源 Android(安卓)游戏引擎
  3. Android(安卓)自定义属性研究
  4. Android(安卓)绘制环形进度图
  5. Rexsee API介绍:Android音频录制,AudioReco
  6. android NDK的学习
  7. Android托管c++的log
  8. Android2.2中的APK安装参数installLocati
  9. 您可能还不知道的八款开源Android游戏引
  10. 自定义View关于measure流程的基本思路整