2017-08-11 504 views
15

我已经配置了我的应用程序以支持Android Oreo,其中包含compileSdkVersion 26。我还为我的电话号码输入字段设置了android:autofillHints="phone"。当我点击该字段时,我可以看到“自动填充”弹出。然而,当我在“自动填充”挖掘,“内容不能被自动填充”出现面包和我看到的logcat以下跟踪:Android自动填充:dispatchProvideAutofillStructure()未布局

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工作室的设计选项卡,我在XML元素添加一个“手机”类型EditText,然后手动插入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来观察。

+2

请提供相关的java和xml代码 –

+0

除了新增加的'android:autofillHints =“phone”'以外,没有什么特别的XML或代码。我会尽力找出一些时间来阐述。不过,自动填充谷歌似乎目前状态还不成熟:https://plus.google.com/+JuusoOhtonen/posts/4kzMk5LUGLW –

+0

好吧,您还没有提供[mcve]帮助我们提供帮助您。你已经放了250条赏金 - 如果你不再向我们展示更多的东西,你会浪费它 –

回答

0

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

0

你的手机上有一个应用程序实现了自动填充服务吗?我使用“Autofill with Google”服务尝试过,并且可以自动填充我的电话号码,而且没有问题(使用运行SDK 26的模拟器)。您需要一个服务部分才能使自动填充工作。见this example

+0

感谢您使用模拟器的提示。基于此,我可以更新我的问题。 –

1

这可能是问题 - 因为

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

Ensuring data is available
在某些特殊情况下,需要采取 额外的步骤,以确保数据是提供给 自动填充保存框架。例如,一项活动可以提供带有标准文本视图的 布局,但随后销毁布局,并将替换为没有子视图的布局,例如GLSurfaceView。

在这种情况下,原始布局中的数据不可用于 框架。为了使数据可用于框架,在替换 原始布局之前,您应该在自动填充管理器对象上调用 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(); 
    } 
} 
+0

问我是否需要更多信息 –

+0

谢谢,我拍了第一张照片,但尚未能修复我的代码。我会继续。 –

+0

嗯,更新模拟器到最新的8.0后,自动填充开始工作,没有任何额外的代码更改。我想知道是否有更新即将推出到真正的设备以及... –

6

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

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

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

希望帮助,

- 费利佩

+0

我的应用程序在更新的Nexus 5X API 26模拟器上的工作方式不同,自动填充功能完美(即使没有长按)。 OTOH,谷歌Nexus XL,一个真正的设备,测试版的程序图像*不*为相同的应用程序提供自动填充,即使长时间没有。测试版程序是否有更新(仿真器似乎有一个更新)? –

+0

更新:经过今天的Google Pixel XL设备更新后,'autofill'完美运行(无需额外更改代码)! –

0

“内容无法自动填充” - 这是我造成的,因为我不同意自动填充服务。因此,进入你的奥利奥和以上的Android设置,并搜索“自动填充”。找到您的服务(我的默认Google),并且应该提示您同意其服务。将其关闭,如果没有出现则关闭。之后,我可以使用自动填充功能。