如何让网页链接实现启动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/

JavaScript 网页链接调用Android程序的更多相关文章

  1. 直接拨号、将电话号码传入拨号程序、调用拨号程序、调用系统浏览器浏览网页、调用系统程序查看联系人、显示系统设置界面和显示Wi-Fi设置界面代码

    直接拨号.将电话号码传入拨号程序.调用拨号程序.调用系统浏览器浏览网页.调用系统程序查看联系人.显示系统设置界面和显示Wi-Fi设置界面代码 拨打号码的代码如下: Intent callIntent= ...

  2. [Javascript]网页链接加上时间戳防止串用户

    最近客服来报,一批用户访问公司网站的时候,由于其网络环境有代理服务器,导致A用户看到B用户的信息,这是非常尴尬的事情.解决的方法也很容易,给网址加上时间戳就可以了,用JS就能实现. JS代码如下 // ...

  3. js调用android本地java代码

    js调用android本地java代码 当在Android上使用WebView控件开发一个Web应用时,可以创建一个通过Javascript调用Android端java代码的接口.也就是可以通过Jav ...

  4. js调用winform程序(带参数)

    我们会发现,我们点击迅雷下载的时候  网页可以调用应用程序,而且连接会传入迅雷,这个是怎么做到的呢? 原理: 先注册表中添加软件的具体信息,然后通过 href 可以直接调用 1.写入注册表信息,注册, ...

  5. Android程序的入口点是什么,不是Main()吗

    很多初入Android开发的网页可能不知道Android程序的入口点是什么,不是main()吗,当然我相信回复onCreate的在字面上不算错,但是你们想的是Activity中的onCreate 方法 ...

  6. Android Webview 和Javascript交互,实现Android和JavaScript相互调用

    在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好 ...

  7. [Swift通天遁地]一、超级工具-(6)通过JavaScript(脚本)代码调用设备的源生程序

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  8. Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

    在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用andro ...

  9. 调用Android自带浏览器打开网页

    转载请注明出处: http://blog.csdn.net/lowprofile_coding/article/details/77928608 在Android中可以调用自带的浏览器,或者指定一个浏 ...

随机推荐

  1. 树 -- AVL树

    前言 通过之前对二叉查找树的讨论,我们知道在给定节点数目的情况下,二叉树的高度越低,查找所用时间也就越短. 在讨论红黑树的时候,我们说过红黑树并非完全"平衡"的二叉树,只是近似&q ...

  2. [C#参考]属性

    属性和字段不同,属性是一个函数成员:它提供灵活的机制来读取.编写或计算某个私有字段的值. 可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法. 这使得可以轻松访问数据,此外还有 ...

  3. PHP中mktime() 函数对于日期运算和验证

    mktime() 函数对于日期运算和验证非常有用.它可以自动校正越界的输入: // 语法:mktime(hour,minute,second,month,day,year) echo(date('Y- ...

  4. PHP基于变量的引用实现的树状结构

    直接上代码: function aryTree($ary, $tagId = 'id', $tagPid = 'pid', $tagSub = '_sub') { if(is_array($ary)) ...

  5. 读取本地HTML的小说阅读器应用源码项目

    该源码是一个不错的读取本地HTML的小说阅读器,读取本地HTML的小说阅读器,并且源码也比较简单的,非常适合我们的新手朋友拿来学习,有兴趣的朋友研究下. 源码下载: http://code.662p. ...

  6. struts2笔记02-action和Action类

    1.action      action表示一个struts2的请求! 2.Action类 能够处理struts2请求的类. (1)属性的名字需要与JavaBeans属性保持一致. 属性的类型可以是任 ...

  7. surface 其实是UEFI与BIOS并存,借用官网的进入方法(少有更改)

    surface 其实是UEFI与BIOS并存,借用官网的进入方法(少有更改) 第一种: 1.       Swipe in from the right edge of the screen, and ...

  8. J2SE知识点摘记(十)

    1.        多线程的同步 2.        同步代码块 即程序中不能有多个线程同时在这两句代码之间执行.(必须两句代码执行完,其他线程才可以公用执行) 同步代码块定义语法如下 ... syn ...

  9. 调bug时候应该提高思维深度(多问二十个为什么)

    版权声明:本文为博主原创文章,未经博主允许不得转载. (一)关于思维深度 读书时 有的人做一份卷子有一份卷子的收获 有的人做100张卷子只有一份卷子的收获 写代码时 有的人调一个Bug可以收获多方面的 ...

  10. HDU 5723 Abandoned country(最小生成树 + 树形DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5723 [题目大意] n座城市,m条路径,求解: 1.最短的路径和,使得n座城市之间直接或者间接连通 ...