android 4.4.2 iframe,Android WebView拦截iframe标签内部跳转教程

最近项目里有个广告位需要动态配置,后台给了一段 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.jb51.net")){

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("//www.jb51.net")){

toast("拦截到了" + url);

Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);

intent.putExtra("url",url);

startActivity(intent);

}else {

webView.loadUrl(url);

}

return true;

}

});

return true;

}

});

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值