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

标签: Android dev | 发表时间:2013-08-06 04: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 web] 推荐:

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.

LibreOffice将发展Web、iOS和Android版本

- Heng Yang - cnBeta.COM
OpenOffice.org的分支项目LibreOffice的开发方The Document Foundation今天宣布将尝试在Web浏览器和iOS、Android移动设备上运行这一办公软件,预计这些产品将在2012年年底到2013年初正式发布.

方便的Android無線管理軟體---remote web desktop

- chris - 癮科技所有文章
最近MOTO ATRIX有一個「Webtop」功能,可以將手機連接底座當作電腦使用. 其實一般的Android手機也可以這麼玩,但使用方式是相反的,可以將您的Android手機當作電腦一般進行管理. 筆者最近在發現一套蠻有趣的Android手機管理軟體---「remote web desktop」可以將您的手機模擬成電腦桌面進行操作管理,而且還是無線的喔.

豪赌Web apps,谷歌Chrome开发工具直通Android

- - IT经理网
关于谷歌内部web app团队和Android团队之间存在矛盾的传言在业界流传已久,但近日Chrome与Android的联姻让外界对谷歌内部两大应用平台之间矛盾的传言不攻自破. 本周二,但谷歌 宣布Chrome DevTools开发工具新增多项功能,包括支持对Android设备的模拟,使用最新Chrome beta版的开发人员可以在浏览器中模拟运行Android设备,甚至直接将Android设备的应用界面投射到电脑屏幕中的Chrome浏览器中.

Google Inbox如何做到在Android、iOS和Web上共享70%的代码

- - Solidot
开发一个移动应用如果你想要面向尽可能广的用户,你需要为Android开发一个,iOS开发一个,Web开发一个. 为每个平台开发一个版本意味着三倍的工作量,三倍的bug处理量. 令整个事件变得更复杂的是,三个平台必须使用不同的语言开发:iOS是Objective-C/Swift、Android是 Java,而Web是JavaScript/CSS/HTML5.

Web未死

- Sinan - GeekPark 捕风捉影
App的极限已经浮现,而Web则是突破此极限,推动下一个数字时代革命的起点. 距离美国《连线》杂志发表《Web已死,互联网永生》这篇文章还不到一年的时间,业界为Web平反的声音渐起. 2010年1月,苹果发布iPad,紧随其后在6月又发布了iPhone4. 没有人质疑过苹果的iTunes+App的商业模式,App可谓如日中天.