服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android WebView拦截iframe标签内部跳转教程

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

2022-12-02 16:03yuan7016 Android

这篇文章主要介绍了Android WebView拦截iframe标签内部跳转教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理。

比如,下面是一段html代码,嵌套这iframe标签,src就是跳转地址,我现在就要当你点击该网址的时候做拦截,自己做处理而不是跳转。

?
1
2
3
4
<html>
<iframe src="http://www.tuohang.net/" frameborder='0' scrolling='no' width='100%' height='300'>
</iframe>
</html>

oh,我还是第一次知道iframe标签,不过想着应该和普通拦截h5差不多,兴致勃勃的就开始撸代码了,但是无论怎么配置WebView,还是重写 shouldOverrideUrlLoading ,就是拦截不了iframe里的网址。。。后来研(bai)究(du)了很久,终于拦截到了。

实现方法:

首先,你的WebView要 setWebViewClient ,重写

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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("http://www.tuohang.net")){
       toast("拦截到了" + url);
       Intent intent = new Intent(getActivity(), CommonWebViewActivity.class);
       intent.putExtra("url",url);
       startActivity(intent);
 
      }else {
       webView.loadUrl(url);
      }
      return true;
     }
    });
 
    return true;
   }
  });

完整的代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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.tuohang.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标签内部跳转教程就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/yuan7016/article/details/96429955

延伸 · 阅读

精彩推荐
  • AndroidAndroid中监听未接来电的2种方法

    Android中监听未接来电的2种方法

    这篇文章主要介绍了Android中监听未接来电的2种方法,本文讲解了使用广播接收器 BrocastReceiver和使用 PhoneStateListener二种方法,需要的朋友可以参考下...

    Android开发网7982021-03-18
  • AndroidAndroid中获得手机屏幕大小实现代码

    Android中获得手机屏幕大小实现代码

    这篇文章主要介绍了Android中获得手机屏幕大小实现代码,Android开发中经常需要获得屏幕的宽高,本文直接封装成一个工具类,需要的朋友可以参考下...

    Android开发网10122021-03-26
  • AndroidAndroid中删除sdcard里文件的命令

    Android中删除sdcard里文件的命令

    这篇文章主要介绍了Android中删除sdcard里文件的命令,本文讲解了删除android模拟器或手机上的sd卡文件的方法,需要的朋友可以参考下...

    Android开发网8962021-03-18
  • AndroidAndroid Studio 修改类的默认注释图文教程

    Android Studio 修改类的默认注释图文教程

    这篇文章主要介绍了Android Studio 修改类的默认注释图文教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小红威武5282022-11-25
  • AndroidAndroid自定义Dialog实现加载对话框效果

    Android自定义Dialog实现加载对话框效果

    这篇文章将介绍如何定制当今主流的对话框,通过自定义dialog实现加载对话框效果,具体实现代码大家通过本文学习吧...

    宿罪5472022-02-19
  • AndroidAndroid编程实现TextView字体颜色设置的方法小结

    Android编程实现TextView字体颜色设置的方法小结

    这篇文章主要介绍了Android编程实现TextView字体颜色设置的方法,结合实例形式总结分析了Android针对TextView字体颜色设置的相关步骤与注意事项,具有一定参考...

    fengyee_zju8182021-04-16
  • Android使用CursorLoader异步加载数据

    使用CursorLoader异步加载数据

    这篇文章主要为大家详细介绍了使用CursorLoader异步加载数据,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    zzqlivecn4132022-03-09
  • AndroidAndroid双重SurfaceView实现弹幕效果

    Android双重SurfaceView实现弹幕效果

    这篇文章主要为大家详细介绍了Android双重SurfaceView实现弹幕效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Android Biubiu5402022-11-09