Android 中通过 URI 实现 Web 页面调用本地 App

标签: Android dev | 发表时间:2013-08-06 12:00 | 作者:
出处:http://RincLiu.com/

HTML 5 和本地 App 各有所长,现在公司的项目中也大量采用 HTML 5 做活动页面,这样本地代码和 HTML 5 的交互就是必须的。

说到 Android 端 Java 代码和 Web 端 HTML / JS 代码的交互,你可能最先想到的就是 WebView 的这两个方法:

  • loadUrl(String url);

  • addJavascriptInterface(Object object, String name);

前者可以实现 native 代码直接执行 JS 代码,而后者可以将 native 代码实现的接口暴露给 Web 页面,这样 Web 页面可以像调用普通 JS function 一样调用这个 native 接口。

但其实还有一种更直接的方式:那就是 URL,准确的说是 URI。

因为 shouldOverrideUrlLoading(WebView view, String url) 等回调方法本身就可以看作 Web 页面通过 URL 和本地应用进行数据交互,因此只要 Web 页面按照 URI 规范将数据传递过来,本地 App 就能在相关回调方法中调用相关 URI 的 API 解析数据,实现数据交互。

事实上,Android 很多内部组件正是通过 URI 传递数据的,特别是在调用系统服务和使用 ContentProvider 时经常用到。例如:

1     
2
3
4
5
6
7
8
//调用地图应用显示地理位置     
Uri uri = Uri.parse("geo:38.899533,-77.036476");
Intent it = new Intent(Intent.Action_VIEW, uri);
startActivity(it);
//调用拨号程序
Uri uri = Uri.parse("tel:18616612345");
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);

假设 Web 页面采用一个超链接将数据以 URI 形式传递过来:

1     
<a href="MY_SCHEME:\\MY_HOST:MY_PORT\MY_PATH\?arg0=0&arg1=1">Open App</a>     

则 Android 端数据解析代码如下:

1     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
webView.setWebViewClient(new WebViewClient(){     
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Uri uri=Uri.parse(url);
if(uri.getScheme().equals(MY_SCHEME)
&& uri.getHost().equals(MY_HOST)
&& uri.getPort() == MY_PORT
&& uri.getPath().equals(MY_PATH)){
String arg0 = uri.getQueryParameter("arg0");
String arg1 = uri.getQueryParameter("arg1");
//TODO
} else {
view.loadUrl(url);
}
return true;
}
});

以上是在 WebView 中加载 Web 页面的情况,如果要使外部浏览器中的 Web 页面也能够调用,则需要在 AndroidManifest.xml 中为指定 Activity 注册 intent-filter :

1     
2
3
4
5
6
7
8
9
10
11
12
13
<activity     
android:name=".activity.UriActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="MY_SCHEME"
android:host="MY_HOST"
android:port="MY_PORT"
android:path="MY_PATH"/>
</intent-filter>
</activity>

对应的在处理 URI 的 Activity 中只需要调用 getIntent().getData() 方法即可读取 URI 数据。

相关 [android 中通 uri] 推荐:

Android 中通过 URI 实现 Web 页面调用本地 App

- - RincLiu.com
HTML 5 和本地 App 各有所长,现在公司的项目中也大量采用 HTML 5 做活动页面,这样本地代码和 HTML 5 的交互就是必须的. 说到 Android 端 Java 代码和 Web 端 HTML / JS 代码的交互,你可能最先想到的就是 WebView 的这两个方法:. 前者可以实现 native 代码直接执行 JS 代码,而后者可以将 native 代码实现的接口暴露给 Web 页面,这样 Web 页面可以像调用普通 JS function 一样调用这个 native 接口.

URI 和 URL的一些研究笔记

- GFans - PuterJam&#39;s Blog
RFC(Request For Comments) ,RFC文档是一系列关于Internet(早期为ARPANET)的技术资料汇总,于1969年开始发布. 它制定了我们很多常见和不常见的Internet的各种文字资料和规范. URI(Universal Resource Identifiers) 统一资源标识符, RFC 文献1630中定义了它详细的规范(1994年6月).

(转)intent 的URI功能示例总汇

- - 移动开发 - ITeye博客
一、打开一个网页,类别是Intent.ACTION_VIEW. 二、打开地图并定位到一个点. 三、打开拨号界面,类型是Intent.ACTION_DIAL. 四、直接拨打电话,与三不同的是,这个直接拨打电话,而不是打开拨号界面. 五、卸载一个应用,Intent的类别是Intent.ACTION_DELETE.

Android中通过当前经纬度获得城市

- - CSDN博客移动开发推荐文章
  * 借助Google MAP 通过用户当前经纬度 获得用户当前城市.  private String city="全国";.   //只是简单的获取城市 不需要实时更新 所以这里先注释. //      //当坐标改变时触发此函数,如果Provider传进相同的坐标,它就不会被触发 . //      System.out.println(".onProviderDisabled(关闭)"+arg0);.

Android 遥控车

- CasparZ - LinuxTOY
您确定您真的会用 Android 手机玩赛车. 16 岁的法国学生 Jonathan Rico 使用 Android 手机通过蓝牙实现了对改装玩具汽车的遥控. 操控的方式和那些标榜的智能手机游戏一样,使用重力感应,差别是这次控制的是现实世界中的遥控汽车. 收藏到 del.icio.us |.

Android免费?毛

- Ruby - FeedzShare
来自: 36氪 - FeedzShare  . 发布时间:2011年08月17日,  已有 2 人推荐. 微软CEO Steve Ballmer在预测竞争对手产品时通常口无遮拦. 比如他去年抨击Google的Android战略时,很多人都不屑一顾. 接着Android蚕食了微软的地盘,后来又开始侵犯苹果的地盘.

GetEd2k (Android应用)

- 某牢 - eMule Fans 电骡爱好者
GetEd2k是一个Android应用程序,作者是anacletus. 此应用可以帮助你把网页中的电驴(eDonkey) 链接添加到你个人电脑的电驴客户端里,不过前提是你的客户端开启了用于远程控制的Web interface(Web服务器,网页接口,Web界面),当然,eMule(电骡), MLDonkey 和 aMule 都支持该功能,所以这三种主流电驴客户端的用户都可以使用GetEd2k.