我已经将我的应用配置为支持使用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选项卡,我添加了一个“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特性。
我是领导Autofill Framework项目的Android框架工程师,因此我将回答一些问题:
因此,我的建议是尝试使用示例自动填充服务实现来首先测试您的应用。最有可能的是,第一次访问您的应用时,自动填充弹出窗口将不会显示,因为该服务没有数据。但是,一旦您的应用程序触发了保存UI(例如,在您手动输入电话号码并且活动结束后)并点击保存,则下次启动活动时该数据应该可用。
希望有所帮助,
- 菲利普
这可能是问题 - 如
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并检查autofill isenabled()。
您可能需要管理java force the Autofill request中的一些设置:
有时,您可能需要强制执行自动填充请求以响应用户操作。 ... / ...
public void eventHandler(View view) {
AutofillManager afm = context.getSystemService(AutofillManager.class);
if (afm != null) {
afm.requestAutofill();
}
}
您的手机上有应用程序实现自动填充服务吗?我尝试使用“Autofill with Google”服务,并且可以自动填充我的电话号码(模拟器运行SDK 26)。您需要一个服务部件才能使自动填充工作。见this example。
获取最新的操作系统映像。下载并安装2017-09-21为我的Google Pixel XL设备提供的更新后,autofill
工作正常。因此,在XML中使用android:autofillHints="phone"
就足够了,无需其他更改即可启用自动填充功能。
“内容无法自动填充” - 这是因为我不同意自动填充服务。所以进入奥利奥及以上的Android设置并搜索“自动填充”。找到你的服务(我的是默认谷歌),应该提示同意其服务。将其关闭,如果没有出现则关闭一个。之后我能够使用自动填充。