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

3,294 阅读3分钟

Android Intents with Chrome

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

Chrome(Android版)25以上版本的功能已略有变化。无法再通过设置iframesrc属性来启动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 filteractivityandroid.intent.category.BROWSABLE能够使用此方法调用,因为它表示该应用程序可以安全地从浏览器打开。

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

  • Intent URI从键入的URL重定向时。
  • Intent URI启动时没有用户手势。