Android WebView拦截iframe标签内部跳转教程
程序员文章站
2023-08-25 23:15:40
最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要android拦截iframe内部的跳转,自己做处理。比如,下面是一段html代码,嵌套这iframe标签,s...
最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要android拦截iframe内部的跳转,自己做处理。
比如,下面是一段html代码,嵌套这iframe标签,src就是跳转地址,我现在就要当你点击该网址的时候做拦截,自己做处理而不是跳转。
<html> <iframe src="https://www.jb51.net/" frameborder='0' scrolling='no' width='100%' height='300'> </iframe> </html>
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; } }); }
以上这篇android webview拦截iframe标签内部跳转教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。