对 Android Webview 中的密码自动填充问题进行故障排除

Temp mail SuperHeros
对 Android Webview 中的密码自动填充问题进行故障排除
对 Android Webview 中的密码自动填充问题进行故障排除

了解自动填充建议的突然消失

如果您的 Android 应用程序在 Web 视图中包含 Web 登录页面,您可以使用系统的密码管理器来提供保存的凭据。通常,当用户点击登录文本框时,用户名或电子邮件地址会出现在键盘顶部。

然而,如果您最近意识到这些想法已经不再出现,那可能会非常令人沮丧。如果您的应用程序代码或密码管理器的设置没有更改,则尤其如此。

这种意外的转变可能是 Android 系统更新的结果,该更新改变了密码建议在 Web 视图中的功能。该问题也可能是由于系统级配置造成的。

许多开发人员现在想知道其他人是否也遇到同样的问题以及可以采取哪些措施来解决该问题。本文将调查该问题的可能根源和补救措施。

命令 使用示例
evaluateJavascript() 此命令在 WebView 中注入并运行 JavaScript 代码。更改嵌入页面上的组件需要它,例如关注输入字段以生成自动填充建议。
AutofillManager.requestAutofill() 该技术特别要求 Android 自动填充系统提示保存特定视图的用户名/密码建议,即使系统不会自动这样做。
setOnFocusChangeListener() 将侦听器附加到 WebView 以检测输入字段何时获得焦点,从而允许我们在焦点发生变化时以编程方式激活操作,例如自动填充。
getSystemService() 该方法获取系统级服务,例如AutofillManager,这是使用Android自动填充功能所必需的。
WebView.setWebViewClient() 允许您在加载内容时自定义 WebView 的行为。在这种情况下,它确保页面加载完成后执行特定的 JavaScript 代码。
isEnabled() 用于确定设备上是否启用 Android 自动填充服务。这是尝试以编程方式使用任何自动填充功能之前的重要步骤。
onPageFinished() 当 WebView 完成加载页面时,将调用此 WebViewClient 方法,允许您注入 JavaScript 并与 DOM 交互。
Mockito.verify() 在单元测试的上下文中,此命令确定是否对模拟对象调用了特定方法(例如 requestAutofill()),以保证代码按预期执行。

了解 WebView 自动填充问题的解决方案

第一个脚本通过将 JavaScript 注入 WebView 并手动触发 Android 自动填充服务来解决该问题。当您单击登录文本框时, 评估Javascript() 方法重点关注输入字段,例如用户名和密码框。这种手动强调使 Android 系统能够识别输入字段并使用之前保存的凭据。方法 onPageFinished() 确保 JavaScript 仅在页面完全加载后执行。该脚本为因 WebView 和 Android 系统之间缺乏联系而导致的任何潜在问题提供了一个简单的解决方案。

第二种方法涉及使用 AutofillManager API 直接请求自动填充。这是一种更加集成的方法,因为它直接与 Android 的本机自动填充系统配合使用。指令 AutofillManager.requestAutofill() 当输入字段获得焦点时运行,允许密码管理器推荐保存的凭据。我们利用 setOnFocusChangeListener() 确保仅在关注适当的领域时才提出此请求。该解决方案对于确保与不同 Android 版本和设备的兼容性非常有用,因为它不依赖外部 JavaScript 来启动自动填充服务。

解决方案的最后一步是使用 AutofillManager API 已启用() 方法查看设备上是否启用了 Android 自动填充服务。在运行任何其他命令来请求自动填充之前,此检查至关重要,因为它会阻止程序尝试使用禁用的功能。这种形式的验证提高了解决方案的稳健性,并确保应用程序根据系统设置有效运行。

最后,使用 Mockito 框架创建单元测试来验证这两个解决方案。这些测试保证了必要的方法,例如 请求自动填充(),在处理 WebView 的输入字段时被调用。使用 Mockito.verify(),我们可以确保 JavaScript 注入和 AutofillManager 集成按计划进行。对这些交互进行单元测试可确保解决方案能够跨多个设备和 Android 版本运行,从而为 WebView 环境中的自动填充问题提供可靠的解决方案。

使用 JavaScript 注入处理 Android Webview 中的自动填充问题

此方法包括将 JavaScript 注入到 WebView 中以手动激活 Android 自动填充服务。

// Inject JavaScript to interact with the WebView input fields
webView.setWebViewClient(new WebViewClient() {
   @Override
   public void onPageFinished(WebView view, String url) {
       // Injecting JavaScript to focus on the username input
       webView.evaluateJavascript("document.getElementById('username').focus();", null);
       // Trigger the password manager to display suggestions
       webView.evaluateJavascript("document.getElementById('password').focus();", null);
   }
});
// Enable JavaScript in WebView if not already enabled
webView.getSettings().setJavaScriptEnabled(true);

通过 Android AutofillManager API 集成修复自动填充

该解决方案采用 AutofillManager API 进行直接集成,确保自动填充功能。

// Use the AutofillManager API to request autofill suggestions manually
AutofillManager autofillManager = (AutofillManager) getSystemService(Context.AUTOFILL_SERVICE);
// Check if Autofill is supported on the device
if (autofillManager != null && autofillManager.isEnabled()) {
   // Request autofill when the username field is focused
   webView.setOnFocusChangeListener((view, hasFocus) -> {
       if (hasFocus) {
           autofillManager.requestAutofill(view);
       }
   });
}

为 JavaScript 和 AutofillManager 方法添加单元测试

使用 JUnit 测试 JavaScript 和 AutofillManager 函数以确保在各种场景中的正确行为。

@Test
public void testJavaScriptAutofillTrigger() {
   // Mock WebView and AutofillManager behavior
   WebView webView = Mockito.mock(WebView.class);
   AutofillManager autofillManager = Mockito.mock(AutofillManager.class);
   webView.evaluateJavascript("document.getElementById('username').focus();", null);
   Mockito.verify(autofillManager).requestAutofill(webView);
}
@Test
public void testAutofillManagerIntegration() {
   // Validate the AutofillManager interaction with focused views
   View mockView = Mockito.mock(View.class);
   AutofillManager autofillManager = Mockito.mock(AutofillManager.class);
   autofillManager.requestAutofill(mockView);
   Mockito.verify(autofillManager).requestAutofill(mockView);

探索 WebView 中的 Android 自动填充服务行为

了解 Android 自动填充服务的工作原理对于解决 Android WebView 中的自动填充问题至关重要。该服务旨在让用户更轻松地在各种应用程序(包括 Web 登录表单)中输入保存的凭据。然而,WebView 的功能可能参差不齐。这是因为,与本机 Android 视图不同,WebView 运行基于 Web 的内容,使得与自动填充等系统服务的交互更难以预测。

自动填充可能意外停止运行的一个主要原因是底层 WebView 组件的更改,该组件作为 Android 系统 WebView 应用程序的一部分定期更新。这些修改可能会改变 WebView 中的输入字段与密码管理器交互的方式,从而导致与概述的问题类似的问题。更新 WebView 组件对于确保与 Android 最新功能和错误补丁的兼容性至关重要。

另一个可能的原因可能是 WebView 中的安全设置。现代 Android 版本优先考虑用户隐私和数据安全。如果 WebView 配置为限制对表单数据的访问,或者禁用 JavaScript,则可能不会显示自动填充建议。开发人员应优化 WebView 设置、启用 JavaScript,并避免将表单视为不安全内容。

有关 Android WebView 自动填充问题的常见问题

  1. 为什么我的自动填充建议在 WebView 中停止工作?
  2. 此问题可能是由于 Android 系统 WebView 组件升级或影响 WebView 中表单数据的安全设置更改造成的。
  3. 如何启用 WebView 自动填充?
  4. 使用 AutofillManager 用于手动激活输入字段自动填充的 API。要使用自动填充建议,请确保您的 WebView 设置允许 JavaScript 执行。
  5. 有没有办法检查我的设备是否支持自动填充?
  6. 是的,您可以使用 AutofillManager.isEnabled() 在询问自动填充建议之前验证设备上是否启用了自动填充的技术。
  7. 如果用户名或密码字段没有触发自动填充,我该怎么办?
  8. 在 WebView 中,您可以使用 JavaScript 注入通过执行来手动集中于输入字段 evaluateJavascript(),突出显示表单字段。
  9. 系统更新会影响 WebView 的自动填充行为吗?
  10. 是的,系统升级,特别是影响 WebView 组件的系统升级,可以改变它与自动填充服务交互的方式。始终保持 Android 系统 WebView 最新。

解决 Android WebView 中的自动填充问题

最后,WebView 自动填充困难可能是由多种情况引起的,例如 Android 系统更新或 WebView 设置更改。解决这些问题需要彻底检查 WebView 设置和系统级权限。

要恢复缺失的功能,请更新 网页视图,启用 JavaScript,并使用 API,例如 自动填充管理器。使用这些策略,开发人员可以确保消费者拥有流畅、无缝的登录体验。

主要来源和参考文献
  1. 详细解释 Android 自动填充管理器 API 及其在应用程序中的用法可以在以下位置找到 Android 开发者文档
  2. 有关常见问题和更新的信息 Android系统WebView 可以在 谷歌播放支持
  3. 深入了解故障排除 自动填充问题 和WebView行为,访问 StackOverflow 讨论