当前位置: 移动技术网 > IT编程>移动开发>Android > Android WebView拦截iframe标签内部跳转教程

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

2020年05月11日  | 移动技术网IT编程  | 我要评论

刘雨欣个人资料,快意之疯狂教师,梦幻控位

最近项目里有个广告位需要动态配置,后台给了一段 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标签内部跳转教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网