浏览器内外跳 -- 跳转到指定应用

Android Intents with Chrome

Android中一个不为人知的功能,可以让您经过Android Intent直接从网页启动应用程序。一种方案是当用户到达页面时启动应用程序,您能够经过在自定义URI方案设置为src的页面中嵌入iframe来实现,以下所示:<iframe src =“paulsawesomeapp://page1” > </iframe>。此功能适用于Chrome for Android浏览器,版本18及更早版本。固然,它也工做在Android浏览器。javascript

Chrome(Android版)25以上版本的功能已略有变化。没法再经过设置iframesrc属性来启动Android应用。例如,使用自定义方案(如paulsawesomeapp://)将iframe导航到URI,即便用户安装了相应的应用程序,也不会工做。相反,您应该实现经过用户手势自定义方案启动应用程序,或使用本文中描述的intent:语法。html

语法

最佳实践是构造一个意图锚点并将其嵌入到页面中,以便用户能够启动应用程序。这为您提供了更多的灵活性,以控制如何启动应用程序,包括经过Intent Extras传递额外的信息到应用程序的能力。java

基于意图的URI的基本语法以下:android

intent:
    HOST/URI-path // Optional host 
   #intent;
      package = [string];
      action = [string];
      category = [string];
      component = [string];
      scheme = [string];
   end;复制代码

查看Android源代码来了解解析细节。git

此外,您能够选择经过添加如下字符串来指定回调网址:github

S.browser_fallback_url=[encoded_full_url]复制代码

当没法解析意图或没法启动外部应用程序时,若是给定了回调网址,用户将会被重定向到回调网址。chrome

Chrome不启动外部应用程序的一些示例状况以下:浏览器

  • 没法解析意图,即没有应用程序能够处理意图。
  • JavaScript计时器试图打开一个没有用户手势的应用程序。

注意S.<name>是一种定义字符串附加的方法。选择S.browser_fallback_url是为了向后兼容,但目标应用程序不会看到browser_fallback_url值,Chrome会删除它。安全

例子

这里有一个意图,启动Zxing条码扫描器应用程序。它遵循如下语法:app

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 filteractivityandroid.intent.category.BROWSABLE可以使用此方法调用,由于它表示该应用程序能够安全地从浏览器打开。

在下列状况下,Chrome不会为指定的Intent URI启动外部应用程序。

  • Intent URI从键入的URL重定向时。
  • Intent URI启动时没有用户手势。
相关文章
相关标签/搜索