【问题标题】:How to use Android autofill API如何使用 Android 自动填充 API
【发布时间】:2020-11-14 11:18:42
【问题描述】:

我已经使用 android webview 组件构建了一个小浏览器,并希望使用 Android AutoFill API 集成密码/凭据管理器支持。

我已阅读文档,但完全迷失了方向,找不到任何与 webviews 等复杂事物集成的示例。

这方面的 javascript 对我来说不是问题,我已经有在用户选择登录表单上的输入时触发的事件(并且应该显示自动填充对话框 ) ,并且当 a 完成输入用户名和密码并提交页面时(并且凭据应该保存回密码管理器),但我很难理解这一点的 android 方面。

webview 似乎已经对此有了一些基本的支持,例如,如果我长按登录表单输入,并在上下文菜单中选择“自动填充”,我可以让它插入一些保存在凭证管理器。问题是虽然凭据已针对我的应用程序 ID 而不是网站域保存,所以我的第一个问题是,当我请求自动填充菜单时,我如何告诉 API 它是针对特定字段类型的(例如用户名/密码)并且属于特定网站,因此它知道要获取哪些凭据并可以稍后更新它们?这是我在登录表单中选择字段时触发自动填充对话框出现的尝试。

更新: 当我在我的应用程序中创建一个静态 webview 时,自动填充会正确保存并提示表单上的凭据,并在每个站点上正确保存它们但是我需要它才能在 recyclerview 中的 webviews 中工作,并且由于某种原因它们没有共享相同的设置。我在 recyclerviews https://developer.android.com/guide/topics/text/autofill-optimize#recycle 中找到了有关自动填充的信息,但使用 setAutofillId() 似乎没有帮助,甚至当我在手机上测试时,这里的官方示例似乎也有点不可靠 https://github.com/android/input-samples/blob/master/AutofillFramework/Application/src/main/java/com/example/android/autofill/app/commoncases/RecyclerViewActivity.java

【问题讨论】:

  • 我不知道答案,但我确信它是可以解决的。我很想研究并尝试找到解决方案,赏金 300 :)。如果您可以共享回购链接,那就太好了,当然除非它是商业的。
  • 我无法分享源代码,但我想将 webview 添加到基本应用程序很容易。关键是自动填充功能适用于不同的域,例如目前 Bitwarden 将所有内容视为来自我的应用程序 ID(好像它认为我的整个应用程序只有一个用户名和密码)。

标签: android android-recyclerview android-webview autofill android-autofill-manager


【解决方案1】:

我遇到的问题是我的 webviews 嵌入在 recyclerview 中,并且要在 recyclerview 中的 web view 上启用自动填充,您必须将其设置为在 recyclerview 上启用,而不是在 webview 本身上启用。

【讨论】:

    【解决方案2】:

    一个简单的解决方案是让 webview 处理这个问题。

    webView.getSettings().setSaveFormData(true);

        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setPluginState(WebSettings.PluginState.ON);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setDisplayZoomControls(true);
        webView.setWebChromeClient(new WebChromeClient() /*Or yourOwnWebChromeClient*/);
        webView.setWebViewClient(new WebViewClient() /*Or yourOwnWebViewClient*/);
        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setSaveFormData(true);
    
        CookieSyncManager.createInstance(this);
        CookieManager cookieManager = CookieManager.getInstance();
        cookieManager.setAcceptCookie(true);
        CookieSyncManager.getInstance().startSync();
    

    如果需要,您还可以添加 JavaScript 接口

        webView.addJavascriptInterface(this, JSInterface);
    

    我使用了这种方法,它保存了 facebook、instagram 和 dailymotion.com 的登录令牌。

    请试试这个https://stackoverflow.com/a/56562679/9640177

    你可以尝试创建多个缓存

    您可能也想参考这个 - https://developer.android.com/guide/webapps/managing-webview#java

    【讨论】:

    • 文档说“这个函数没有任何效果”。对于setSaveFormData(),自奥利奥以来已被弃用。如果您已经对其进行了测试并记住了跨多个网站的登录凭据,那么听起来我做错了什么。所以你没有在清单或 XML 中做任何特别的事情?也许我需要在一个更简单的应用程序中尝试这个
    • 我在 stack-overflow 上使用了各种答案中的所有这些设置...不确定究竟是哪个设置有帮助。可能是 cookie
    • 好的,这绝对与我的设置有关。如果我创建一个静态 webview 它可以工作,但是我用于浏览器的 webview 不起作用,也许是因为它们在 recyclerview 上?嗯
    • 你可以尝试创建多个缓存
    • 您可以考虑在宽限期结束之前奖励赏金,以免浪费
    【解决方案3】:

    guide available here 描述了如何让您的应用准备好利用自动填充功能。以下是描述您的选择的最相关部分,尤其是在使用 Webview 时:

    在许多情况下,自动填充可以在您的应用中轻松运行。但是为了确保一致的行为,我们建议提供明确的提示来告诉框架你字段的内容。您可以使用 android:autofillHints 属性或 setAutofillHints() 方法来执行此操作。

    不过,要将您的应用与网站相关联,您需要在应用的清单中添加一些设置。您将在上面链接的第 2 步下看到这一点。

    您需要使用asset_statements 资源更新应用的清单文件,该资源链接到托管assetlinks.json 文件的URL。完成后,您需要将更新后的应用提交到 Play 商店,并填写从属关系提交表,以便关联上线。

    使用 Android Studio 3.0 时,App Links Assistant 可以为您生成所有这些。当您打开 DAL 生成器工具(工具 -> 应用程序链接助手 -> 打开数字资产链接文件生成器)时,只需确保启用标有“支持在应用程序和网站之间共享凭据”的新复选框。 同样,在您的应用程序中使用 WebViews,您可以使用 HTML 自动完成属性来提供有关字段的提示。只要您的设备上安装了 Chrome 61 或更高版本,自动填充功能就可以在 WebViews 中使用。即使您的应用使用自定义视图,您也可以定义允许自动填充工作的元数据。

    【讨论】:

    • 感谢您的回答,但我认为这对它自己没有帮助。这是一个浏览器应用程序,因此用户可以访问任何网站,因此不能在其上托管 JSON 文件。可能有一种方法可以伪造它,但不幸的是,我明天晚上没有太多时间来试验它
    猜你喜欢
    • 1970-01-01
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多