Android Intents with Chrome
Android中一个鲜为人知的功能,可让您通过Android Intent
直接从网页启动应用程序。一种方案是当用户到达页面时启动应用程序,您可以通过在自定义URI方案设置为src的页面中嵌入iframe来实现,如下所示:<iframe src =“paulsawesomeapp://page1” > </iframe>
。此功能适用于Chrome for Android浏览器,版本18及更早版本。当然,它也工作在Android浏览器。
Chrome(Android版)25
以上版本的功能已略有变化。无法再通过设置iframe
的src
属性来启动Android应用。例如,使用自定义方案(如paulsawesomeapp://
)将iframe
导航到URI,即使用户安装了相应的应用程序,也不会工作。相反,您应该实现通过用户手势自定义方案启动应用程序,或使用本文中描述的intent:
语法。
语法
最佳实践是构造一个意图锚点并将其嵌入到页面中,以便用户可以启动应用程序。这为您提供了更多的灵活性,以控制如何启动应用程序,包括通过Intent Extras传递额外的信息到应用程序的能力。
基于意图的URI的基本语法如下:
intent:
HOST/URI-path // Optional host
#intent;
package = [string];
action = [string];
category = [string];
component = [string];
scheme = [string];
end;
查看Android源代码来了解解析细节。
此外,您可以选择通过添加以下字符串来指定回调网址:
S.browser_fallback_url=[encoded_full_url]
当无法解析意图或无法启动外部应用程序时,如果给定了回调网址,用户将会被重定向到回调网址。
Chrome不启动外部应用程序的一些示例情况如下:
- 无法解析意图,即没有应用程序可以处理意图。
JavaScript
计时器试图打开一个没有用户手势的应用程序。
注意S.<name>
是一种定义字符串附加的方法。选择S.browser_fallback_url
是为了向后兼容,但目标应用程序不会看到browser_fallback_url
值,Chrome会删除它。
例子
这里有一个意图,启动Zxing条码扫描器应用程序。它遵循以下语法:
intent:
//scan/
#Intent;
package=com.google.zxing.client.android;
scheme=zxing;
end;
要启动Zxing条形码扫描器应用程序,您需要在锚上对href
进行编码,如下所示:
<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"> Take a QR code </a>
参见Android Zxing Manifest,它定义了包和主机。
此外,如果指定了回调网址,则完整网址将如下所示:
<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;S.browser_fallback_url=http%3A%2F%2Fzxing.org;end"> Take a QR code </a>
现在,如果无法找到应用程序,或者链接是由没有用户手势的JavaScript
触发的(或者我们不启动外部应用程序的其他情况),则URL
将使您进入zxing.org
。
href = "intent:mydata#Intent;action=myaction;type=text/plain;end"
从用法上看,还是很好理解的,这里的代码等价于如下Java代码:
Intent intent = new Intent("myaction");
intent.setData(Uri.parse("mydata"));
intent.setType("text/plain");
intent://foobar/#Intent;action=myaction;type=text/plain;S.xyz=123;i.abc=678;end
上面的语句,等价于如下Java代码:
Intent intent = new Intent("myaction");
intent.setData(Uri.pase("//foobar/"));
intent.putExtra("xyz", "123");
intent.putExtra("abc", 678);
注意事项
如果通过
intent
调用的activity
包含extras
功能,您也应该包括这些extras
功能。只有具有
category filter
的activity
,android.intent.category.BROWSABLE
能够使用此方法调用,因为它表示该应用程序可以安全地从浏览器打开。
在下列情况下,Chrome不会为指定的Intent URI
启动外部应用程序。
- 当
Intent URI
从键入的URL重定向时。 - 当
Intent URI
启动时没有用户手势。