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

Android中WebView实现点击超链接启动QQ的方法

程序员文章站 2023-11-13 13:04:40
前言 之前有次在面试的时候,面试官问了一个如何在webview点击超链接启动类型qq类似第三方应用,我当时的回答是用webview与js交互可以做到。面试官听了没再说什么...

前言

之前有次在面试的时候,面试官问了一个如何在webview点击超链接启动类型qq类似第三方应用,我当时的回答是用webview与js交互可以做到。面试官听了没再说什么,应该是答案不是他期望的。今天发现原来可以这样实现,记录一下。

实现思路

在web开发中,启动qq来临时会话,可以通过一个url链接

<a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&menu=yes" rel="external nofollow" >启动qq</a>

把20178888换成你的qq号即可。在android手机有些浏览器里这样也可以正常被调用。

但如果我们要使用webview展示web页面,页面里包含了上面的链接,却无法正常的启动qq。

我们可以在webview里重载 setwebviewclient方法

 mwebview.setwebviewclient(new webviewclient() {
  public boolean shouldoverrideurlloading(webview view, string url) {
    view.loadurl(url);
    return true;
   }
  });

这样webview里面的超链接要是被触发了,webview会去加载替代默认浏览器加载。

http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&menu=yes

这个链接我们看起来这是一个很正常的http请求,通过抓包发现调用的qq不仅仅是进行一次http的请求,实际还发送了这么一个请求:mqqwpa://im/chat开头的。

mqqwpa:// 这部分url的部分,叫做url的sechme部分。

这里就比较好理解为什么会跳到腾讯应用宝官网,http://wpa.qq.com/是腾讯应用宝的官网,这是第一次请求,
由于它接着再次请求的协议不是http而是mqqwpa://im/chat。

而实际上真正调用qq的是mqqwpa://im/chat,这时我们应该使用一个intent来操作调用原生的qq。

我们需要捕获这些url,当遇到普通网页交给webview处理,走正常流程;当遇到以mqqwpa开头的,交给默认浏览器处理。
这样webview点击超链启动qq问题就解决了。

下面我们来看实现方式:

其实我们重载 shouldinterceptrequest 方法,来截获其他的sechme处理即可。

webview.setwebviewclient(new webviewclient() {
   public boolean shouldoverrideurlloading(webview view, string url) {
    view.loadurl(url);
    return true;
   }

   @override
   public webresourceresponse shouldinterceptrequest(webview view, string url) {
    if (url.startswith("http") || url.startswith("https")) { //http和https协议开头的执行正常的流程
     return super.shouldinterceptrequest(view, url);
    } else { //其他的url则会开启一个acitity然后去调用原生app
     intent in = new intent(intent.action_view, uri.parse(url));
     startactivity(in);
     return null;
    }
   }
  });

完整代码:

  mwebview = (progresswebview) findviewbyid(r.id.baseweb_webview);
  mwebview.getsettings().setjavascriptenabled(true);
  string url ="http://wpa.qq.com/msgrd?v=3&uin=748895431&site=qq&menu=yes";
  mwebview.loadurl(url);
  mwebview.setwebviewclient(new webviewclient() {
   public boolean shouldoverrideurlloading(webview view, string url) {
    view.loadurl(url);
    return true;
   }

   @override
   public webresourceresponse shouldinterceptrequest(webview view, string url) {
    if (url.startswith("http") || url.startswith("https")) { //http和https协议开头的执行正常的流程
     return super.shouldinterceptrequest(view, url);
    } else { //其他的url则会开启一个acitity然后去调用原生app
     intent in = new intent(intent.action_view, uri.parse(url));
     startactivity(in);
     return null;
    }
   }
  });

运行效果

Android中WebView实现点击超链接启动QQ的方法

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。