欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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标签内部跳转教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。