如何使用Android自动填充API

11

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

我已经阅读了文档,但完全不理解,并找不到与 webview 等复杂东西集成的示例。

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

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

更新:

当我在应用程序中创建静态的Web视图时,自动填充会正确保存并提示表单凭据,并根据站点正确保存它们,但是我需要在RecyclerView中的Web视图中使其工作,但由于某种原因它们不工作,尽管它们共享相同的设置。我找到了有关在RecyclerView中使用自动填充的信息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赏金:)。如果可以的话,请分享存储库链接,除非它是商业用途的。 - Rinat Diushenov
我不能分享源代码,但我猜在基本应用程序中添加Webview应该很容易。关键是自动填充可以跨不同域工作,例如,目前Bitwarden将所有内容视为来自我的应用程序ID(好像它认为我的整个应用程序只有一个用户名和密码)。 - MeatPopsicle
你有检查过这些示例吗?https://github.com/android/input-samples/tree/master/AutofillFramework/Application/src/main/java/com/example/android/autofill/app - M D P
在WebView中加载网页:https://dev59.com/B53ha4cB1Zd3GeqPRkN3#76412796 - Mori
3个回答

3
一个简单的解决方案是让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()函数已自Oreo版本起被弃用,并且“此函数没有任何效果”。如果您已经测试过它并且可以记住多个网站的登录凭据,那么似乎我做错了什么。所以您在清单或XML文件中没有进行任何特殊设置吗?也许我需要在一个更简单的应用程序中尝试一下。 - MeatPopsicle
我从 stack-overflow 的各种答案中使用了所有这些设置... 不确定哪个设置起了作用。可能是 cookie。 - Mayank Kumar Chaudhari
好的,这肯定与我的设置有关。如果我创建一个静态的 webview 它可以工作,但是我用于浏览器的 webviews 不起作用,也许是因为它们在 recyclerview 上?嗯嗯 - MeatPopsicle
创建多个缓存。 - Mayank Kumar Chaudhari
您可以在宽限期结束之前考虑授予悬赏,以免浪费。 - Mayank Kumar Chaudhari
更改缓存模式的链接似乎与此无关,我不想强制使用缓存,而是将其保留在默认模式下(适用于其他 Webview)。由于我还没有有效的解决方案,我不确定是否应该奖励悬赏。这似乎是一个问题,因为 Webview 在 RecyclerView 中。有什么想法吗?我找到了文档,显示在 RecyclerView 中使用自动填充时需要设置 autofillId,但它似乎仍然无法与 Webview 一起使用。 - MeatPopsicle

2

这里提供了一个指南, 描述了如何准备您的应用程序以利用Autofill。以下是最相关的部分,特别是在使用Webview时:

在许多情况下,Autofill可能可以在您的应用程序中无需任何努力即可工作。但为了确保一致的行为,我们建议提供显式提示,告诉框架有关字段内容的信息。您可以使用android:autofillHints属性或setAutofillHints()方法来实现此目的。

要将您的应用程序与网站关联起来,您需要向应用程序的清单中添加一些设置。您可以在上面的链接的第二步中看到这一点。

您需要使用asset_statements资源更新应用程序的清单文件,该资源链接到托管assetlinks.json文件的URL。完成后,您需要提交已更新的应用程序到Play商店,并填写关联提交表格,以使关联生效。

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

1
谢谢您的回答,但我认为这本身并没有什么帮助。它是一个浏览器应用程序,因此用户可能正在访问任何网站,因此在它们上面托管JSON文件不是一个选项。也许有一种方法可以模拟它,但不幸的是,明晚我将没有太多时间来尝试。 - MeatPopsicle

0
我遇到的问题是我的 WebViews 嵌入在一个 RecyclerView 中,要使 RecyclerView 中的 WebView 可以启用自动填充,必须将其设置为在 RecyclerView 上启用,而不是在 WebView 本身上启用。

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