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

17

我已将我的应用配置为使用 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的Design选项卡中,我添加了一个“手机”类型的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自动填充似乎是一个不太成熟的功能:https://plus.google.com/+JuusoOhtonen/posts/4kzMk5LUGLW - Juuso Ohtonen
第一句:不,我没有为此设置250美元的赏金。 第二句:正如我在Google Plus帖子中展示的那样,我目前甚至无法选择“使用Google自动填充”,因此我真的无法提供可验证的示例(因为我目前无法自行验证)。 - Juuso Ohtonen
我可以在API 26模拟器上使用“Autofill with Google”。基于此,我更新了问题以包含一个XML元素。 - Juuso Ohtonen
现在正在使用1.9.17版本。 - k4dima
更新:在今天为我的Google Pixel XL设备进行的更新后,“自动填充”功能完美运行(无需额外的代码更改)! - Juuso Ohtonen
5个回答

8
我是Android框架工程师,负责Autofill Framework项目。以下是我的回答:
  • "无法自动填充内容"消息通常意味着Autofill服务不知道如何自动填充屏幕。当您为应用程序添加自动填充支持时,最好先使用您可以控制的Autofill服务,而不是像密码管理器这样的"真实"服务。正如在之前的回复中提到的那样,我们提供了一个示例服务,可用于此目的。
  • 当您长按文本字段并选择AUTOFILL时,实际上是在"强制"进行自动填充请求,就像另一个回复中提到的一样(即,在幕后,文本字段正在调用AutofillManager.requestAutofill())。如果Autofill服务知道如何自动填充您的屏幕,则您不需要这样做,因为一旦您聚焦输入字段,自动填充建议将立即显示出来。
  • 在您的情况下,您不需要设置importantForAutofill或调用AutofillManager.cancel()
因此,我的建议是首先尝试使用示例Autofill Service实现来测试您的应用程序。很可能,在您第一次访问应用程序时,自动填充弹出窗口不会显示,因为服务没有相关数据。但是,一旦您的应用程序触发保存UI(例如,在手动输入电话号码并完成活动后),并且您点击保存,那些数据应该在您下次启动活动时可用。
希望这有所帮助,
- Felipe

我的应用在更新的Nexus 5X API 26模拟器上运行方式不同,自动填充功能完美运作(甚至无需长按)。然而,使用beta程序图像的真实设备Google Nexus XL对于同一应用程序没有提供自动填充功能,即使长按也不行。是否有一个beta程序的更新即将到来(因为仿真器似乎已经有了更新)? - Juuso Ohtonen
更新:在今天为我的Google Pixel XL设备进行的更新后,“自动填充”功能完美运行(无需额外的代码更改)! - Juuso Ohtonen
@Felipe Leme,您能否解释一下为什么自动填充会填错EditText字段? - hemanth kumar

2
这很可能是问题所在 - 因为
as service for ComponentInfo{com.google.android.gms/com.google.android.gms.autofill.service.AutofillService} is already destroyed

确保数据可用
在某些特殊情况下,您需要采取额外的步骤,以确保数据对Autofill框架可用以保存。例如,一个活动可以呈现具有标准文本视图的布局,但然后销毁该布局并替换为没有子视图(如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();
    }
}

谢谢,我已经尝试了第一步,但是还没有修复好我的代码。我会继续努力的。 - Juuso Ohtonen
嗯,将模拟器更新到最新的8.0版本后,自动填充功能开始正常工作,而无需进行任何额外的代码更改。我想知道真实设备是否也会很快有更新... - Juuso Ohtonen

0

你的手机上有实现自动填充服务的应用程序吗?我尝试使用“Google 自动填充”服务,可以在模拟器运行 SDK 26 的情况下轻松地自动填充我的电话号码。你需要一个服务部分来使自动填充工作。请参见this example


感谢您关于使用模拟器的提示。基于此,我能够更新我的问题。 - Juuso Ohtonen

0

“内容无法自动填充” - 这是因为我没有同意自动填充服务所导致的。因此,请进入您的安卓设置(Oreo及以上版本),并搜索“自动填充”。找到您的服务(我的默认为谷歌),应该会有一个提示要求您同意其服务。如果没有出现,请将其切换关闭。之后,我就能够使用自动填充了。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接