启用自动填充时,不会使用 Smart Lock API 保存凭据以获取密码

Posted

技术标签:

【中文标题】启用自动填充时,不会使用 Smart Lock API 保存凭据以获取密码【英文标题】:Credentials are not being saved with Smart Lock API for passwords when Autofill is enabled 【发布时间】:2020-06-19 03:29:14 【问题描述】:

我目前正在一个 android 应用程序中为密码实现 Smart Lock,我正在关注文档: https://developers.google.com/identity/smartlock-passwords/android/store-credentials

在 android Oreo 及以上版本中有此自动填充功能,我确实看到该字段中的自动填充弹出窗口,我的问题是在尝试保存凭据时,我收到了错误:

16: Credentials API's save confirmation dialog has been disabled to avoid conflicts with the Android Autofill feature. This choice may be overridden via CredentialsOptions.

我在其他帖子中读到过,这是一个预期错误,它可以防止它声明conflicts with the Android Autofill feature,但我没有看到任何其他对话框来确认保存凭据。

我尝试使用模拟器和真实设备得到相同的结果。 然后我尝试按照文档强制显示 Smart Lock for Passwords 保存对话框:

在构建 CredentialsClient 时,通过 CredentialsOptions 为所有平台启用保存确认对话框。

CredentialsOptions options = new CredentialsOptions.Builder()
        .forceEnableSaveDialog()
        .build();
mCredentialsClient = Credentials.getClient(this, options);

通过将与登录字段关联的根视图标记为对自动填充不重要来抑制自动填充保存对话框:

<!-- Mark the root view with android:importantForAutofill="noExcludeDescendants" -->
<LinearLayout
    android:importantForAutofill="noExcludeDescendants"
    android:layout_
    android:layout_
    android:orientation="vertical">
    <!-- ... -->
</LinearLayout>     

我做到了,它成功了,保存时显示对话框,但自动填充功能消失了(如预期的那样),我需要弹出窗口,这是我的要求的一部分。

我还尝试只应用上面提到的CredentialsOptions options 而没有XML 中的属性,但没有成功。更糟糕的是,撤消该操作时,应用程序按预期停止工作并开始抛出前面提到的错误,我卸载并重新启动手机,但仍然没有显示对话框并抛出相同的错误,即使它具有抑制自动填充应用的修复程序.

我已检查,该应用不在declined sites and apps 列表中 我检查了系统->语言->更多->自动填充->选择了谷歌

我希望有人可以帮助我。

【问题讨论】:

【参考方案1】:

伙计们,我自己找到了答案,我发布这个以防其他人需要它。

在我的特定场景中,问题是由于没有更改活动引起的,我在一个小型概念单活动应用程序中遇到了这个问题,所以“自动填充上下文”没有完成。我在自动填充文档中发现了这个概念:

https://developer.android.com/guide/topics/text/autofill-optimize#ensure

底线是要么完成当前活动并转移到另一项活动,要么调用:

 val autofillManager = requireContext().getSystemService(AutofillManager::class.java)
autofillManager.commit()

【讨论】:

我做的完全一样,但是没有出现对话框。我正在使用 TextInputLayout 和 TextInputEditText。你有什么想法为什么?你是在替换片段之前还是之后调用了 commit? @peshkira 你找到解决方案了吗?我也将它与 Fragment 一起使用,但我看不到“将密码保存到 Google?”当我转到 LoginFragment 到 DashboardActivity 时的对话框。 我想是的。我不确定它是否完美,但它似乎可以在我的设备上运行。我最终做的基本上是每次文本字段在我的表单中未聚焦时手动取消会话,并为下一个聚焦视图请求新的自动填充。最后在导航(片段导航,单个活动)之前,我按照建议在自动填充管理器上调用 commit。但它似乎有效,只有当我手动取消并重新请求时。不知道为什么。

以上是关于启用自动填充时,不会使用 Smart Lock API 保存凭据以获取密码的主要内容,如果未能解决你的问题,请参考以下文章

Smart Lock 显示不是来自我的应用的帐户

浏览器地址自动填充不会填充“状态”SelectField 元素

#-webkit-autofill##google#启用表单自动填充时,如何覆盖黄色背景

启用浏览器的表单自动填充

synchronized和lock

在 Firebase 登录上实施 Smart Lock 密码