Android自动填充:dispatchProvideAutofillStructure()未布局

时间:2017-08-11 05:14:25

标签: android android-logcat autofill android-8.0-oreo

我已将我的应用配置为使用compileSdkVersion 26支持Android Oreo。我还为我的电话号码输入字段设置了android:autofillHints="phone"。当我点击该字段时,我可以看到"自动填充" 弹出。但是,当我点击"自动填充" "内容无法自动填充" toast出现,我看到了跟踪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" />

使用此XML可以观察到上述Logcat特性。

5 个答案:

答案 0 :(得分:6)

我是领导自动填充框架项目的Android框架工程师,因此我将回答一些问题:

  • &#34;内容无法自动填充&#34; 消息通常表示自动填充服务不知道如何自动填充屏幕。当您向自己的应用添加自动填充支持时,通常可以更轻松地使用您可以先控制的自动填充服务,而不是真正的&#34;真实的&#34;像密码管理器一样的服务。如前一个回复中所述,我们提供了可用于此目的的sample service
  • 当您长按文本字段并选择 AUTOFILL 时,您实际上是&#34;强制&#34;另一个回复中提到的自动填充请求(即,文本字段在后面调用 AutofillManager.requestAutofill()的幕后)。如果自动填充服务知道如何自动填充您的屏幕,则您不应该这样做,因为一旦您关注输入字段,自动填充建议会立即显示。
  • 您不应该在您的情况下设置 importantForAutofill 或致电 AutofillManager.cancel()

因此,我的建议是尝试使用示例自动填充服务实现来首先测试您的应用。最有可能的是,第一次访问您的应用时,自动填充弹出窗口不会显示,因为该服务没有数据。但是,一旦您的应用程序触发了保存UI(例如,在您手动输入电话号码并且活动结束后)并点击保存,则下次启动活动时该数据应该可用。

希望有所帮助,

- 费利佩

答案 1 :(得分:1)

这可能就是问题 - 正如

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

<强> Ensuring data is available
  在某些特殊情况下,您需要采取   确保数据可用的其他步骤   自动填充框架保存。例如,活动可以呈现   布局与标准文本视图,但然后破坏布局和   将其替换为没有子视图的视图,例如GLSurfaceView。

     

在这种情况下,原始布局中的数据不可用   框架。要使数据可用于框架,您应该   在替换之前,在AutofillManager对象上调用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();
    }
}

答案 2 :(得分:0)

您的手机上是否有可实现自动填充服务的应用?我尝试使用“Autofill with Google”服务,并且可以自动填充我的电话号码(模拟器运行SDK 26)。您需要一个服务部件才能使自动填充工作。请参阅this example

答案 3 :(得分:0)

获取最新的操作系统映像。下载并安装2017-09-21为我的Google Pixel XL设备提供的更新后,autofill完美无缺。因此,在XML中使用android:autofillHints="phone"就足够了,无需其他更改即可启用自动填充功能。

答案 4 :(得分:0)

&#34;内容无法自动填充&#34; - 这是因为我不同意自动填充服务。所以进入奥利奥及以上的Android设置并搜索&#34; autofill&#34; 。找到你的服务(我的是默认谷歌),应该提示同意其服务。将其关闭,如果没有出现则关闭一个。之后我能够使用自动填充。