將自動填入功能與輸入法編輯器和自動填入服務整合

從 Android 11 開始,鍵盤及其他輸入法編輯器 (簡稱「IME」) 可在建議列或類似容器中以內嵌方式顯示自動填入建議,而非由系統在選單中顯示這些建議。這些自動填入建議可能包含密碼或信用卡資訊等私人資料,因此在使用者選擇某項建議之前,系統會向 IME 隱藏建議。如要充分利用這項功能,請更新 IME 和自動填入服務,例如密碼管理工具。如果 IME 或自動填入服務不支援內嵌自動填入功能,選單中就會顯示建議,如同在 Android 11 以下版本中一樣。

工作流程

在這個流程中,「IME」是指目前的鍵盤或其他輸入編輯器,而「建議供應程式」則指適合該自動填入建議的供應程式。視輸入欄位和使用者設定而定,建議供應程式可能是平台或自動填入服務。

  1. 使用者著重在觸發自動填入的輸入欄位,例如密碼或信用卡輸入欄位。

  2. 平台查詢目前的 IME 和適當的建議供應程式,瞭解是否支援內嵌自動填入功能。如果 IME 或建議供應程式不支援內嵌自動填入功能,選單中就會顯示建議,如同在 Android 10 以下版本一樣。

  3. 平台要求 IME 提供「建議要求」。這個建議要求會指定最多要顯示幾項建議,並為每項建議提供「呈現規格」。呈現規格能指定大小上限、文字大小、顏色和字型資料等,讓建議供應程式符合 IME 的外觀和風格。

  4. 平台要求建議供應程式提供不超過所要求數量的建議。每一項建議都包含一個回呼,用來加載包含建議 UI 的 View

  5. 平台向 IME 指出建議已準備就緒。IME 顯示建議時,是透過呼叫回呼方法來加載每個建議的 View。為保護使用者的私人資訊,IME 在這個階段「無法」看見建議內容。

  6. 如果使用者選取其中一項建議,系統會通知 IME,方法與使用者從系統選單中挑選建議時一樣。

以下各節說明如何設定 IME 或自動填入服務,支援內嵌自動填入功能。

設定 IME 以支援內嵌自動填入功能

本節說明如何將 IME 設定為支援內嵌自動填入功能。如果 IME 不支援內嵌自動填入功能,平台會預設在選單中顯示自動填入建議。

IME 必須supportsInlinedSuggestions 屬性設定為 true

<input-method
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:supportsInlineSuggestions="true"/>

當平台需要自動填入建議時,會呼叫 IME 的 InputMethodService.onCreateInlineSuggestionsRequest() 方法。您必須導入這個方法。傳回指定以下各項的 InlineSuggestionsRequest

  • IME 想要的建議數量。
  • 每項建議的 InlinePresentationSpec,用於定義須如何呈現建議。

平台產生建議時,會呼叫 IME 的 onInlineSuggestionsResponse() 方法,傳遞包含建議的 InlineSuggestionsResponse。您必須實作這個方法。實作時,請呼叫 InlineSuggestionsResponse.getInlineSuggestions() 取得建議清單,然後呼叫 InlineSuggestion.inflate() 方法來加載各項建議。

設定自動填入服務以支援內嵌自動填入功能

本節說明如何設定自動填入服務,支援內嵌自動填入功能。如果應用程式不支援內嵌自動填入功能,平台會預設在選單中顯示自動填入建議。

自動填入服務必須supportsInlinedSuggestions 屬性設為 true

<autofill-service
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:supportsInlineSuggestions="true"/>

如果 IME 需要自動填入建議,平台會呼叫自動填入服務的 onFillRequest() 方法,就像在 Android 11 以下版本中一樣。但您的服務必須呼叫已傳遞 FillRequest 物件的 getInlineSuggestionsRequest() 方法,才能取得 IME 建立的 InlineSuggestionsRequestInlineSuggestionsRequest 會指定需要多少內嵌建議,以及須如何呈現每項建議。如果 IME 不支援內嵌建議,這個方法會傳回 null

自動填入服務會建立多個 InlinePresentation 物件,但不超過 InlineSuggestionsRequest 所要求數量的上限。呈現方式必須遵守 InlineSuggestionsRequest 所指定的大小限制。如要將建議傳回 IME,請為每項建議呼叫 Dataset.Builder.setValue()。Android 11 提供各版本的 Dataset.Builder.setValue(),可支援內嵌建議。