2017-08-11 187 views
15

我已經配置了我的應用程序以支持Android Oreo,其中包含compileSdkVersion 26。我還爲我的電話號碼輸入字段設置了android:autofillHints="phone"。當我點擊該字段時,我可以看到「自動填充」彈出。然而,當我在「自動填充」挖掘,「內容不能被自動填充」出現麪包和我看到的logcat以下跟蹤:Android自動填充:dispatchProvideAutofillStructure()未佈局

RemoteFillService Not handling { when=-3ms what=3 target=com.android.internal.os.HandlerCaller$MyHandler } as service for ComponentInfo{com.google.android.gms/com.google.android.gms.autofill.service.AutofillService} is already destroyed 
View    dispatchProvideAutofillStructure(): not laid out, ignoring 

我應該如何解決這個問題?我已確認我的電話號碼配置爲設置>系統>語言&輸入>高級>輸入幫助>自動填充服務

使用示例XML更新:在API 26仿真器設置中,我可以選擇「使用Google自動填充」。使用Android工作室的設計選項卡,我在XML元素添加一個「手機」類型EditText,然後手動插入android:autofillHints="phone":上述

<EditText 
    android:id="@+id/editText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:ems="10" 
    android:inputType="phone" 
    android:autofillHints="phone" /> 

logcat的特點可以使用此XML來觀察。

+2

請提供相關的java和xml代碼 –

+0

除了新增加的'android:autofillHints =「phone」'以外,沒有什麼特別的XML或代碼。我會盡力找出一些時間來闡述。不過,自動填充谷歌似乎目前狀態還不成熟:https://plus.google.com/+JuusoOhtonen/posts/4kzMk5LUGLW –

+0

好吧,您還沒有提供[mcve]幫助我們提供幫助您。你已經放了250條賞金 - 如果你不再向我們展示更多的東西,你會浪費它 –

回答

0

獲得最新的操作系統映像。在下載並安裝了適用於我的Google Pixel XL設備的2017-09-21版本的更新後,autofill完美無缺。因此,在XML中使用android:autofillHints="phone"就足夠了,無需其他更改即可啓用自動填充功能。

0

你的手機上有一個應用程序實現了自動填充服務嗎?我使用「Autofill with Google」服務嘗試過,並且可以自動填充我的電話號碼,而且沒有問題(使用運行SDK 26的模擬器)。您需要一個服務部分才能使自動填充工作。見this example

+0

感謝您使用模擬器的提示。基於此,我可以更新我的問題。 –

1

這可能是問題 - 因爲

as service for ComponentInfo{com.google.android.gms/com.google.android.gms.autofill.service.AutofillService} is already destroyed 

Ensuring data is available
在某些特殊情況下,需要採取 額外的步驟,以確保數據是提供給 自動填充保存框架。例如,一項活動可以提供帶有標準文本視圖的 佈局,但隨後銷燬佈局,並將替換爲沒有子視圖的佈局,例如GLSurfaceView。

在這種情況下,原始佈局中的數據不可用於 框架。爲了使數據可用於框架,在替換 原始佈局之前,您應該在自動填充管理器對象上調用 commit()

您需要在Java代碼中修復其中的一些問題。

添加IMPORTANT_FOR_AUTOFILL_AUTO並檢查自動填充isenabled()

您可能需要在Java force the Autofill request中管理的一些設置:

有時候,你可能需要強制響應用戶操作發生的自動填充請求。 .../...

public void eventHandler(View view) { 
    AutofillManager afm = context.getSystemService(AutofillManager.class); 
    if (afm != null) { 
     afm.requestAutofill(); 
    } 
} 
+0

問我是否需要更多信息 –

+0

謝謝,我拍了第一張照片,但尚未能修復我的代碼。我會繼續。 –

+0

嗯,更新模擬器到最新的8.0後,自動填充開始工作,沒有任何額外的代碼更改。我想知道是否有更新即將推出到真正的設備以及... –

6

我是Android的框架工程師主導的自動填充框架的項目,所以我會回答一些問題:

  • 「內容不能被自動填充」消息通常意味着自動填充服務不知道如何自動填充屏幕。當您爲自己的應用添加自動填充支持時,使用首先可以控制的自動填充服務通常更容易,而不是像密碼管理器那樣的「真正」服務。正如在前面的回覆中提到的,我們提供了一個可用於此目的的sample service
  • 當你長按文本字段,然後選擇自動填入,你實際上是「逼迫」自動填充請求作爲在另一個答覆(即提到,幕後的文本字段調用AutofillManager.requestAutofill() )。如果自動填充服務知道如何自動填充屏幕,則不需要這樣做,因爲一旦您關注輸入字段,自動填充建議就會立即顯示出來。
  • 您應該不需要設置importantForAutofill或致電AutofillManager.cancel()您的情況。

因此,我的建議是嘗試使用示例自動填充服務實現來首先測試您的應用程序。很可能,第一次訪問您的應用時,自動填充彈出窗口將不會顯示,因爲該服務沒有數據。但是,一旦您的應用觸發了保存界面(例如,手動輸入電話號碼並完成活動後),然後點擊保存,那麼下次啓動該活動時該數據應該可用。

希望幫助,

- 費利佩

+0

我的應用程序在更新的Nexus 5X API 26模擬器上的工作方式不同,自動填充功能完美(即使沒有長按)。 OTOH,谷歌Nexus XL,一個真正的設備,測試版的程序圖像*不*爲相同的應用程序提供自動填充,即使長時間沒有。測試版程序是否有更新(仿真器似乎有一個更新)? –

+0

更新:經過今天的Google Pixel XL設備更新後,'autofill'完美運行(無需額外更改代碼)! –

0

「內容無法自動填充」 - 這是我造成的,因爲我不同意自動填充服務。因此,進入你的奧利奧和以上的Android設置,並搜索「自動填充」。找到您的服務(我的默認Google),並且應該提示您同意其服務。將其關閉,如果沒有出現則關閉。之後,我可以使用自動填充功能。