You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android WebView中JavaScript覆盖层重定向显示异常排查

自定义WebView浏览器搜索结果覆盖层显示问题

我基于WebView实现了一款自定义浏览器,多数网站运行正常,但访问https://smittenkitchen.com/时出现关键问题:

  • 首页加载显示正常;
  • 输入搜索词(如“carrot”,对应地址https://smittenkitchen.com/?s=carrot)后,先进入样式简陋的“搜索表单”页面,随后显示空白覆盖层(Logcat中无该覆盖层显示/重定向的记录);
  • 标准浏览器中执行相同操作,会在简陋搜索表单页显示0.5-2秒后,加载出填充搜索结果的覆盖层。

已排查的实现细节

我在MyWebViewClient中重写了以下方法:

  • onPageStarted
  • onPageFinished
  • shouldOverrideUrlLoading
  • onPageCommitVisible

其中前3个方法仅输出Logcat日志,无自定义逻辑;仅onPageCommitVisible有自定义操作——调用WebView的loadUrl()执行一段JavaScript,将页面HTML传递给原生接口:

javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML)

该接口通过以下代码注册:

webView.addJavascriptInterface(new MyJavascriptInterface(this, webView), "HTMLOUT");

注意:尽管页面有明显的内容切换,但Android WebView框架从未调用shouldOverrideUrlLoading(推测是客户端侧重定向,未修改URL)。

重写方法代码

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    Log.d("", "url: " + url + ", view: " + view.getUrl());
}
@Override
public void onPageFinished(WebView view, String url) {
    Log.d("", "url: " + url + ", view: " + view.getUrl());
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest webResourceRequest) {
    Log.d("", "webResourceRequest: " + webResourceRequest.getUrl() + ", view: " + view.getUrl());
    return false;
}
@Override
public void onPageCommitVisible(WebView view, String url) {
    super.onPageCommitVisible(view, url);
    view.loadUrl("javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML)"); // convert all javascript to HTML
    Log.v("", "url (passed): " + url + " < view.getUrl(): " + view.getUrl());
}

WebSettings配置

已启用JavaScript,相关配置如下:

webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
webSettings.setBlockNetworkLoads(false);
webSettings.setDomStorageEnabled(true);

webSettings.setLoadWithOverviewMode(true);
webSettings.setUseWideViewPort(false);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false);
webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
webSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

相关Logcat片段

11:12:03.716                           D   url: https://smittenkitchen.com/, view: https://smittenkitchen.com/ (called from: MyWebViewClient.onPageFinished) 
11:12:03.988                           D   url: https://smittenkitchen.com/, view: https://smittenkitchen.com/ (called from: MyWebViewClient.onPageStarted)
11:12:05.646                           E   net::ERR_CONNECTION_REFUSED(-6) on request: https://ssc.33across.com/api/v1/hb?guid=cYCh20L9Or64olaKj0P0Le, https://smittenkitchen.com/ (called from: MyWebViewClient.onReceivedError)
11:12:05.787  MyWebView                V   javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML); (called from: MyWebView.loadUrl < MyWebViewClient.onPageCommitVisible)
11:12:05.790  MyWebViewClient          V   url (passed): https://smittenkitchen.com/ < view.getUrl(): https://smittenkitchen.com/ (called from: MyWebViewClient.onPageCommitVisible)
11:12:08.097                           D   url: https://smittenkitchen.com/, view: https://smittenkitchen.com/ (called from: MyWebViewClient.onPageFinished)
11:12:23.824                           D   url: https://smittenkitchen.com/?s=carrot, view: https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onPageStarted)
11:12:24.083  MyWebView                V   javascript:window.HTMLOUT.processHTML(document.getElementsByTagName('html')[0].innerHTML); (called from: MyWebView.loadUrl < MyWebViewClient.onPageCommitVisible)
11:12:24.085  MyWebViewClient          V   url (passed): https://smittenkitchen.com/?s=carrot < view.getUrl(): https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onPageCommitVisible)
11:12:25.176                           E   net::ERR_CONNECTION_REFUSED(-6) on request: https://ssc.33across.com/api/v1/hb?guid=cYCh20L9Or64olaKj0P0Le, https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onReceivedError)
11:12:26.583                           D   url: https://smittenkitchen.com/?s=carrot, view: https://smittenkitchen.com/?s=carrot (called from: MyWebViewClient.onPageFinished)

请问我的实现中缺失了什么,才能让基于WebView的浏览器像Chrome一样正常显示搜索结果覆盖层?


内容的提问来源于stack exchange,提问作者Introspective

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:12:55