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

Android WebView如何从Message对象获取新窗口的URL?

WebView onCreateWindow 无法捕获window.open() URL的解决方案

重写WebView的onCreateWindow方法时,用requestFocusNodeHref只能获取<a href="..." target="_blank">标签打开的URL,无法捕获window.open('example.com')这类JS调用打开的链接,可通过以下方式解决:

核心思路

创建新的WebView实例,通过其WebViewClient的shouldOverrideUrlLoading方法拦截window.open()发起的请求,从而获取目标URL。

代码实现

@Override
public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg) {
    // 初始化新WebView实例
    WebView newWebView = new WebView(view.getContext());
    WebSettings webSettings = newWebView.getSettings();
    
    // 开启必要配置,和原WebView保持一致
    webSettings.setJavaScriptEnabled(true);
    webSettings.setSupportMultipleWindows(true);
    webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
    
    // 设置WebViewClient拦截URL
    newWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            String targetUrl = request.getUrl().toString();
            // 此处拿到window.open()打开的URL,执行你的业务逻辑
            // 示例:打印日志
            Log.d("WebWindowUrl", targetUrl);
            
            // 如需阻止WebView加载该URL,返回true;允许加载则返回super方法结果
            return super.shouldOverrideUrlLoading(view, request);
        }
    });
    
    // 将新WebView关联到系统回调消息
    WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
    transport.setWebView(newWebView);
    resultMsg.sendToTarget();
    
    return true;
}

说明

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:52:26