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

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

使用者可以透過長按主畫面按鈕或說出鍵句來啟動 Google 助理。為回應,系統會開啟頂層視窗,顯示內容相關動作。

Google 助理應用程式 (例如 Google 助理) 會透過名為「觸控即時資訊」的功能實作 Google 助理重疊視窗,此功能可搭配 Android 平台層級功能使用。系統可讓使用者選取助理應用程式,以便使用 Android 的 Assist API 從應用程式取得背景資訊。

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

使用 Google 助理

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

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

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

圖 2. 輔助與語音輸入設定

來源應用程式

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

與小幫手分享其他資訊

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

為了向 Google 助理提供其他資訊,您的應用程式可以註冊應用程式事件監聽器,並透過活動回呼提供活動特定資訊,如圖 3 所示:

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

為了提供全域應用程式結構定義,應用程式會建立 Application.OnProvideAssistDataListener 的實作,並使用 registerOnProvideAssistDataListener() 註冊。為了提供活動專屬的背景資訊,該活動會覆寫 onProvideAssistData()onProvideAssistContent()。系統會在叫用選用的全域回呼「之後」呼叫兩種活動方法。回呼會在主執行緒上執行,因此應提示完成。系統只會在活動執行時叫用回呼。

提供相關背景

使用者啟動助理時,系統會呼叫 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() 回呼,系統會繼續處理,並將自動收集的資訊傳遞至 Google 助理,除非目前的視窗已標記為「安全」。如圖 3 所示,系統會使用 onProvideStructure()onProvideVirtualStructure() 的預設實作來收集文字和檢視區塊階層資訊。如果檢視區塊實作自訂文字繪圖,請覆寫 onProvideStructure(),透過呼叫 setText(CharSequence) 向 Google 助理提供使用者顯示的文字。

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

排除小幫手的觀看次數

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

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

語音互動

也會在偵測索引鍵時叫用 Assist API 回呼。詳情請參閱「語音操作」說明文件。

Z 順序注意事項

Google 助理會使用顯示在目前活動上方的輕量重疊視窗。由於使用者可以隨時啟動助理,請勿建立會幹擾重疊視窗的永久 系統快訊視窗,如圖 4 所示。

圖 4. 輔助圖層 Z 順序

如果應用程式使用 系統快訊視窗,請立即移除這些視窗,以免對使用者體驗造成負面影響。

目的地應用程式

Google 助理應用程式通常會利用深層連結,找出目的地應用程式。為了讓您的應用程式成為可能的目的地應用程式,請考慮加入深層連結支援。目前使用者背景資訊與深層連結,或是疊加視窗中顯示的其他潛在動作 (如圖 1 步驟 3 所示) 的比對結果,專屬於 Google 助理的實作項目。舉例來說,Google 助理應用程式會使用深層連結和應用程式連結,將流量導向目的地應用程式。

導入專屬的 Google 助理

我們建議您實作自己的助理。如圖 2 所示,使用者可以選取使用中的 Google 助理應用程式。助理應用程式必須提供 VoiceInteractionSessionServiceVoiceInteractionSession 的實作,如 VoiceInteraction 範例所示。此外,也需要 BIND_VOICE_INTERACTION 權限。然後,助理便可以接收文字和檢視區塊階層,以 onHandleAssist()AssistStructure 的執行個體表示。該應用程式會透過 onHandleScreenshot() 接收螢幕截圖。