瀏覽器內外跳 -- 跳轉到指定應用

018912251077_發表於2017-03-08

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啟動時沒有使用者手勢。

相關文章