web-dev-qa-db-ja.com

Android自動入力:dispatchProvideAutofillStructure()がレイアウトされていません

Android Oreo with compileSdkVersion 26をサポートするようにアプリを構成しました。電話番号入力フィールドにもAndroid:autofillHints="phone"を設定しました。フィールドをタップすると、 "Autofill"ポップアップが表示されますが、"Autofill"をタップすると、"コンテンツを自動入力できません"トーストが表示されますlogcatに次のトレースが表示されます。

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 Studioの[デザイン]タブを使用して、"Phone"タイプEditTextを追加し、XMLに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を使用して観察できます。

16
Juuso Ohtonen

最新のOSイメージを取得します。 2017-09-21にGooglePixel XLデバイスで利用可能になったアップデートをダウンロードしてインストールした後、autofillは完全に機能します。したがって、XMLにAndroid:autofillHints="phone"があれば十分であり、自動入力機能を有効にするために他の変更は必要ありません。

0
Juuso Ohtonen

私はAutofillFrameworkプロジェクトを率いるAndroid Frameworksエンジニアなので、いくつかの質問に答えます。

  • 「コンテンツを自動入力できません」メッセージは、通常、自動入力サービスが画面の自動入力方法を認識していないことを意味します。アプリに自動入力サポートを追加する場合、パスワードマネージャーのような「実際の」サービスよりも、最初に制御できる自動入力サービスを使用する方が簡単な場合がよくあります。前の返信で述べたように、この目的に使用できる サンプルサービス を提供します。
  • テキストフィールドを長押しして[〜#〜]自動入力[〜#〜]を選択すると、実際には自動入力リクエストが「強制」されます別の返信で述べられているように(つまり、舞台裏でテキストフィールドが呼び出していますAutofillManager.requestAutofill())。自動入力サービスが画面を自動入力する方法を知っている場合は、入力フィールドにフォーカスするとすぐに自動入力の候補が表示されるため、その必要はありません。
  • importantForAutofillを設定したり、AutofillManager.cancel()を呼び出したりする必要はありません。 )あなたの場合。

したがって、最初にサンプルの自動入力サービスの実装を使用してアプリをテストすることをお勧めします。ほとんどの場合、アプリに初めてアクセスしたときに、サービスにデータがないため、自動入力ポップアップは表示されません。ただし、アプリが保存UIをトリガーし(たとえば、電話番号を手動で入力してアクティビティが終了した後)、[保存]をタップすると、次にアクティビティを起動したときにそのデータを利用できるようになります。

お役に立てば幸いです。

-フェリペ

6
Felipe Leme

これが問題になる可能性があります-として

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

データが利用可能であることを確認する
一部の特殊なケースでは、データをオートフィルフレームワークで保存できるようにするために、追加の手順を実行する必要があります。たとえば、アクティビティは標準のテキストビューでレイアウトを表示できますが、レイアウトを破棄して、GLSurfaceViewなどの子ビューのないレイアウトに置き換えます。

この場合、元のレイアウトのデータはフレームワークで使用できません。フレームワークでデータを利用できるようにするには、元のレイアウトを置き換える前に、AutofillManagerオブジェクトで commit() を呼び出す必要があります。

Javaコード内でこれらの問題のいくつかを修正する必要があります。

IMPORTANT_FOR_AUTOFILL_AUTO を追加し、自動入力 isenabled() であることを確認します。

Java 自動入力リクエストを強制する :内のいくつかの設定を管理する必要がある場合があります。

場合によっては、ユーザーの操作に応じて自動入力リクエストを強制的に実行する必要があります。 ... /.。

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

「コンテンツを自動入力できません」-これは、自動入力サービスに同意しなかったために発生しました。したがって、Oreo以上のAndroid設定に移動し、「自動入力」を検索します。サービスを見つけます(私の場合はデフォルトのグーグルでした)。サービスに同意するためのプロンプトが表示されます。オフに切り替えます。表示されない場合は1つ。その後、自動入力を使用できるようになりました。

0
j2emanue

オートフィルサービスを実装するアプリが携帯電話にありますか? 「AutofillwithGoogle」サービスで試してみたところ、問題なく電話番号を自動入力できました(SDK 26を実行しているエミュレーターを使用)。自動入力を機能させるには、サービスパーツが必要になります。 この例 を参照してください。

0
artkoenig