JavaScript 网页链接调用Android程序

简介: 如何让网页链接实现启动Android的应用,网上有说重写WebView相关的shouldOverrideUrlLoading方法,但是这种理论上能实现,因为你的网页不是仅仅被你自己的webview来浏览,你需要做的是让市面上的浏览器支持才行。

如何让网页链接实现启动Android的应用,网上有说重写WebView相关的shouldOverrideUrlLoading方法,但是这种理论上能实现,因为你的网页不是仅仅被你自己的webview来浏览,你需要做的是让市面上的浏览器支持才行。

主要涉及到的问题就是关于Intent在字符串形式和Intent对象之间的转换。把Intent以字符串的形式传递给Android 里面的java代码接受,然后解析转化为对应Intent执行即可,主要涉及java和JavaScript的交互。

 

两种表现形式

Intent是Android开发中常见的API。在处理Android组件中,有着必不可少的作用。Intent可以以两种方式存在。

  • Intent对象。用于在程序中处理,在处理Android组件时使用。
  • 字符串形式的URI。 用于在非程序代码中,如网页中进行使用等。

而这里我们解决我们上面问题的就是后者,字符串形式的Intent。

Intent对象转成字符串URI

Intent提供了两种将对象转换成字符串URI,一个是推荐的public String toUri (int flags), 在API 4加入,将Intent对象转换成字符串形式的URI。字符串形式的URI可以包含Intent的data,action,categories, type, flags, package, component和extras。

 

Intent intent = new Intent();
ComponentName comp = new ComponentName("com.mx.app.mxhaha", "com.mx.app.MxMainActivity");
intent.setComponent(comp);
Log.i(LOGTAG, "intent.uri=" + intent.toUri(Intent.URI_INTENT_SCHEME));

生成的字符串URI为

intent:#Intent;component=com.mx.app.mxhaha/com.mx.app.MxMainActivity;end

  

另一个方法是public String toURI (), 这是一个弃用的方法,因为它生成的字符串以#开头,放在链接上会被当成锚点。不建议使用使用这个方法。

上面的Intent对象使用toUri转换成

 

#Intent;component=com.mx.app.mxhaha/com.mx.app.MxMainActivity;end

  

字符串URI转成Intent对象

getIntent(String uri)

这个方法只适用于处理以#开头的URI,而且在其方法内部实际上是调用的parseUri(uri, 0)来实现的。这个方法已经被比较为弃用,不推荐使用。

getIntentOld(String uri)

getIntentOld既可以支持#开头的URI转换成Intent对象,如果uri不是Intent的字符串形式,那么也会返回一个Intent,只是其data部分为uri,action为android.intent.action.VIEW。

parseUri(String uri, int flags)

这个是最完整的转换方法。接收uri和flag作为参数。支持将字符串形式的URI转成Intent对象.

以下为一个既可以解析intent:开头的URI也可以解析#Intent开头的URI的方法。

 

public static Intent parseIntent(String url) {
  Intent intent = null;
  // Parse intent URI into Intent Object
  int flags = 0;
  boolean isIntentUri = false;
  if (url.startsWith("intent:")) {
      isIntentUri = true;
      flags = Intent.URI_INTENT_SCHEME;
  } else if (url.startsWith("#Intent;")) {
      isIntentUri = true;
  }
  if (isIntentUri) {
      try {
          intent = Intent.parseUri(url, flags);
      } catch (URISyntaxException e) {
          e.printStackTrace();
      }
  }
  return intent;
}

  

对于Intent字符串形式URI在网页链接中的应用存在安全隐患,在乌云平台已经有人发现漏洞,使用需要谨慎。使用addJavascriptInterface在安卓4.2以下是有安全漏洞的,可以用这篇文章http://www.pedant.cn/2014/07/04/webview-js-java-interface-research/ 的方法来避免这个漏洞,另外传参也可以是自定义对象,functuon异步回调等等,返回值也可以自定义。

转自: http://droidyue.com/blog/2014/11/23/start-android-application-when-click-a-link/

 

目录
相关文章
|
4月前
|
JavaScript 前端开发 数据库连接
js的异常程序处理机制
js的异常程序处理机制
19 0
|
4月前
|
Android开发
【安卓版】网页转应用v1.2,生成属于你的专属应用
【安卓版】网页转应用v1.2,生成属于你的专属应用
51 2
|
4月前
|
存储 JavaScript API
Nuxt.js:用 Vue.js 打造服务端渲染应用程序(三)
Nuxt.js:用 Vue.js 打造服务端渲染应用程序
|
4月前
|
JavaScript 中间件 网络架构
Nuxt.js:用 Vue.js 打造服务端渲染应用程序(一)
Nuxt.js:用 Vue.js 打造服务端渲染应用程序
|
4月前
|
JavaScript 前端开发
如何用JS实现基础的抽奖程序
如何用JS实现基础的抽奖程序
20 0
|
5月前
|
JavaScript 前端开发 Serverless
函数计算只支持Node.js,我用C++写的程序怎么运行?
函数计算只支持Node.js,我用C++写的程序怎么运行?
93 1
|
21天前
|
Linux Android开发
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
测试程序之提供ioctl函数应用操作GPIO适用于Linux/Android
14 0
|
5月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
51 1
|
4天前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
|
6天前
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
12 0