【问题标题】:Android autofill: dispatchProvideAutofillStructure() not laid outAndroid 自动填充:dispatchProvideAutofillStructure() 未布局
【发布时间】:2018-01-19 12:17:30
【问题描述】:

我已使用compileSdkVersion 26 将我的应用配置为支持 Android Oreo。我还为我的电话号码输入字段设置了android:autofillHints="phone"。当我点击该字段时,我可以看到 “自动填充” 弹出。但是,当我点击 "Autofill" 时,"Contents can't be autofill" 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的Design选项卡,我添加了一个“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 特性。

【问题讨论】:

  • 除了新添加的android:autofillHints="phone"之外,XML或代码没有什么特别之处。我会尽量找时间详细说明。但是,Google 的自动填充功能在其当前状态下似乎有点不成熟:plus.google.com/+JuusoOhtonen/posts/4kzMk5LUGLW
  • 第一:不,我没有悬赏 250。第二:正如我在 Google Plus 帖子中所展示的,我目前什至无法选择“使用 Google 自动填充”,所以我真的无法提供可验证的示例(因为我目前无法自己验证)。
  • 我可以在 API 26 模拟器上使用“使用 Google 自动填充”。基于此,我更新了问题以包含 XML 元素。
  • 现在工作 1.9.17
  • 更新:今天更新我的 Google Pixel XL 设备后,autofill 完美运行(无需额外更改代码)!

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


【解决方案1】:

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

【讨论】:

  • 感谢有关使用模拟器的提示。基于此,我可以更新我的问题。
【解决方案2】:

这很可能是问题 - 因为

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();
    }
}

【讨论】:

  • 谢谢,我拍了第一张照片,但我还不能修复我的代码。我会继续。
  • 嗯,将模拟器更新到最新的 8.0 后,自动填充开始工作,无需任何额外的代码更改。我想知道是否有即将更新到真实设备的更新......
【解决方案3】:

我是负责自动填充框架项目的 Android 框架工程师,所以我会回答一些问题:

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

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

希望对你有帮助,

-- 费利佩

【讨论】:

  • 我的应用在更新后的 Nexus 5X API 26 模拟器上的运行方式有所不同,自动填充在该模拟器上运行良好(即使没有长按)。 OTOH,Google Nexus XL,一款带有测试版程序图像的真实设备为同一个应用程序提供自动填充功能,即使在长按后也不提供。 Beta 版程序是否有更新(因为模拟器似乎有更新)?
  • 更新:今天更新我的 Google Pixel XL 设备后,autofill 完美运行(无需额外更改代码)!
  • @Felipe Leme,您能否解释一下,为什么自动填充会填充错误的 EditText 字段?
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    “内容无法自动填充” - 这是因为我不同意自动填充服务造成的。因此,进入 Oreo 及更高版本中的 android 设置并搜索“自动填充”。找到你的服务(我的是默认谷歌),应该有一个提示同意它的服务。将其关闭,如果没有出现则关闭它。之后我能够使用自动填充。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多