針對 Google 助理進行上下文最佳化調整

Android 6.0 Marshmallow 推出了透過 Google 助理等小幫手應用程式,讓使用者與應用程式互動的新方式。助理是頂層視窗,使用者可以查看該視窗,取得目前活動的關聯動作。這些動作可能包含指向裝置上其他應用程式的深層連結。

使用者只要長按主畫面按鈕或說出關鍵字詞,即可啟動 Google 助理。系統會在回應中開啟頂層視窗,顯示與情境相關的動作。

Google 助理等小幫手應用程式,會透過名為「觸控即時資訊」的功能實作 Google 助理疊加視窗,該功能可與 Android 平台層級的功能搭配使用。系統會允許使用者選取助理應用程式,該應用程式會使用 Android 的 Assist API 從您的應用程式取得背景資訊。

本指南說明 Android 應用程式如何使用 Android 的 Assist API 改善助理使用者體驗。如要瞭解如何建立媒體應用程式,以便 Google 助理啟動及控制,請參閱「Google 助理和媒體應用程式」。

使用 Google 助理

圖 1 說明一般的 Google 助理使用者互動。當使用者長按主畫面按鈕時,系統會在「來源」應用程式中叫用 Assist API 回呼 (步驟 1)。Google 助理會算繪重疊視窗 (步驟 2 和 3),然後使用者選取要執行的動作。助理會執行所選動作,例如透過深層連結觸發意圖,前往餐廳應用程式 (目的地) (步驟 4)。

圖 1. Google 助理與 Google 應用程式的「觸控即時資訊」功能互動範例

使用者可以依序選取「設定」>「應用程式」>「預設應用程式」>「小幫手與語音輸入」,設定這個助理。使用者可以變更系統選項,例如以文字形式存取螢幕內容和螢幕截圖,如圖 2 所示。

圖 2. 小幫手與語音輸入設定

來源應用程式

為確保應用程式使用助理做為使用者的資訊來源,只需遵循無障礙最佳做法即可。本節說明如何提供額外資訊,協助改善 Google 助理使用者體驗,以及需要特殊處理的情境 (例如自訂檢視區塊)。

與 Google 助理分享其他資訊

除了文字和螢幕截圖外,應用程式也可以將其他資訊提供給 Google 助理。舉例來說,音樂應用程式可以選擇傳遞目前專輯資訊,讓 Google 助理能根據目前活動建議更聰明的動作。請注意,Assist API 不提供媒體控制項。如要新增媒體控制項,請參閱「 Google 助理和媒體應用程式」一文。

如要向助理提供額外資訊,應用程式可以註冊應用程式事件監聽器,並使用活動回呼提供活動專屬資訊,如圖 3 所示:

圖 3. Assist API 生命週期序列圖

為提供全域應用程式結構定義,應用程式會建立 Application.OnProvideAssistDataListener 的實作項目,並使用 registerOnProvideAssistDataListener() 註冊該項目。為提供活動專屬的情境資訊,活動會覆寫 onProvideAssistData()onProvideAssistContent()。系統會在之後呼叫可選的全球回呼,以呼叫這兩個活動方法。由於回呼會在主執行緒上執行,因此應盡快完成。只有在活動執行時,系統才會叫用回呼。

提供相關背景

當使用者啟動 Google 助理時,系統會呼叫 onProvideAssistData() 來建構完整的 ACTION_ASSIST 意圖,其中包含以 AssistStructure 例項表示的目前應用程式的所有內容。您可以覆寫這個方法,將任何內容放入套件,以便顯示在輔助意圖的 EXTRA_ASSIST_CONTEXT 部分。

說明內容

應用程式可以實作 onProvideAssistContent(),藉由提供與目前活動相關的內容參照資料,改善 Google 助理的使用者體驗。您可以透過 JSON-LD 物件,使用 Schema.org 定義的通用詞彙來描述應用程式內容。在以下範例中,音樂應用程式會提供結構化資料,說明使用者目前正在查看的音樂專輯:

Kotlin

override fun onProvideAssistContent(assistContent: AssistContent) {
    super.onProvideAssistContent(assistContent)

    val structuredJson: String = JSONObject()
            .put("@type", "MusicRecording")
            .put("@id", "https://example.com/music/recording")
            .put("name", "Album Title")
            .toString()

    assistContent.structuredData = structuredJson
}

Java

@Override
public void onProvideAssistContent(AssistContent assistContent) {
  super.onProvideAssistContent(assistContent);

  String structuredJson = new JSONObject()
       .put("@type", "MusicRecording")
       .put("@id", "https://example.com/music/recording")
       .put("name", "Album Title")
       .toString();

  assistContent.setStructuredData(structuredJson);
}

您也可以透過自訂 onProvideAssistContent() 實作來改善使用者體驗,這可提供下列好處:

注意: 使用自訂文字選取實作的應用程式,可能需要實作 onProvideAssistContent() 並呼叫 setClipData()

預設實作方式

如未實作 onProvideAssistData()onProvideAssistContent() 回呼,系統會繼續執行,並將自動收集的資訊傳遞給助理,除非目前的視窗標記為「安全」。如圖 3 所示,系統會使用 onProvideStructure()onProvideVirtualStructure() 的預設實作項目收集文字和檢視區塊階層資訊。如果您的檢視區塊實作自訂文字繪製,請覆寫 onProvideStructure(),透過呼叫 setText(CharSequence) 為 Google 助理提供要向使用者顯示的文字。

在大多數情況下,實作無障礙支援服務可讓助理取得所需資訊。如要實作無障礙設計支援,請觀察使應用程式可供存取中所述的最佳做法,包括:

排除由助理提供的觀看次數

如要處理敏感資訊,應用程式可以設定 WindowManagerFLAG_SECURE 版面配置參數,藉此從 Google 助理中排除目前的檢視畫面。您必須為活動建立的每個視窗 (包括對話方塊) 明確設定 FLAG_SECURE。應用程式也可以使用 setSecure() 將介面排除在 Google 助理之外。目前沒有全域 (應用程式層級) 機制可排除助理中的所有檢視畫面。請注意,FLAG_SECURE 不會導致 Assist API 回呼停止觸發。使用 FLAG_SECURE 的活動仍可透過本指南先前提及的回呼,向 Google 助理應用程式明確提供資訊。

注意: 如果是公司帳戶 (Android for Work),管理員可以使用 DevicePolicyManager API 的 setScreenCaptureDisabled() 方法,停用工作資料夾的助理資料收集功能。

語音互動

系統也會在偵測到關鍵字時叫用 Assist API 回呼。詳情請參閱 語音動作說明文件。

Z 順序注意事項

助理會使用輕量重疊視窗,顯示在目前活動的頂端。由於使用者隨時可以啟動助理,請勿建立會干擾疊加視窗的永久系統警示視窗,如圖 4 所示。

圖 4. 輔助圖層 Z 順序

如果您的應用程式使用 系統快訊視窗,請立即移除,因為這些視窗在畫面上留下會降低使用者體驗。

目標應用程式

助理應用程式通常會利用深層連結找出目的地應用程式。如要讓應用程式成為可能的目的地應用程式,建議您新增深層連結支援。目前使用者情境與深層連結,或疊加視窗中顯示的其他可能動作 (如圖 1 所示) 的比對結果,是 Google 助理的實作專用結果。舉例來說,Google 助理應用程式會使用深層連結和應用程式連結,將流量導向目的地應用程式。

導入自己的 Google 助理

您可以自行實作助理。如圖 2 所示,使用者可以選取使用中的助理應用程式。助理應用程式必須提供 VoiceInteractionSessionServiceVoiceInteractionSession 的實作,如VoiceInteraction 範例所示。也需要 BIND_VOICE_INTERACTION 權限。接著,助理就能接收文字和檢視區塊階層,並以 onHandleAssist() 中的 AssistStructure 例項表示。透過 onHandleScreenshot() 接收螢幕截圖。