文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 17:44

关注

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

您可能感兴趣的文章:解决webview内的iframe中的事件不可用的问题android webview获取html代码和根据id获取value实例Android实现触发html页面的Button控件点击事件方式Android Webview的postUrl与loadUrl加载页面实例


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯