Android autofill: dispatchProvideAutofillStructure() not lai



我已经将我的应用程序配置为支持带有compileSdkVersion 26的Android Oreo。我还为我的电话号码输入字段设置了android:autofillHints="phone"。当我点击该字段时,我可以看到弹出"自动填充"。但是,当我点击"自动填充">时,会出现"内容无法自动填充">吐司,并在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 进行观察。

我是 Android 框架工程师,负责 Autofill Framework 项目,所以我会回答一些问题:

  • "无法自动填充内容">消息通常表示自动填充服务不知道如何自动填充屏幕。当您向应用添加自动填充支持时,使用您可以先控制的自动填充服务通常更容易,而不是像密码管理器这样的"真实"服务。如之前的回复所述,我们提供了一个可用于此目的的示例服务。
  • 当您长按文本字段并选择自动填充时,您实际上是在"强制"另一个回复中提到的自动填充请求(即,在幕后文本字段正在调用AutofillManager.requestAutofill(((。如果自动填充服务知道如何自动填充屏幕,则无需执行此操作,因为一旦您聚焦输入字段,自动填充建议就会立即显示。
  • 在这种情况下,您不需要设置importantForAutofill或调用AutofillManager.cancel((。

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

希望有帮助,

--菲 利 普

这很可能是问题所在 - 作为

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并检查自动填充是否已启用((。

您可能需要管理 java 强制自动填充请求中的某些设置:

有时,您可能需要强制自动填充请求以响应用户操作。

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

您的手机上是否有实现自动填充服务的应用程序?我尝试使用"使用 Google 自动填充"服务,并且可以毫无问题地自动填充我的电话号码(使用运行 SDK 26 的模拟器(。您将需要一个服务部件来使自动填充正常工作。请参阅此示例。

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

">

内容无法自动填充">- 这是为我引起的,因为我不同意自动填充服务。 因此,进入奥利奥及更高版本的安卓设置,然后搜索 "自动填充" .找到你的服务(我的是默认的谷歌(,应该有一个提示同意它的服务。将其关闭,如果未出现,则将其切换。之后我能够使用自动填充。

最新更新