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; }
说明
requestFocusNodeHref仅针对页面中获得焦点的DOM节点(如点击的标签)生效,无法捕获JS主动调用window.open()的请求;- 新WebView必须开启JavaScript和多窗口支持,否则
window.open()无法触发onCreateWindow回调; - 若不需要实际加载新窗口内容,可在
shouldOverrideUrlLoading中返回true阻止加载,仅获取URL即可。
内容的提问来源于stack exchange,提问作者user13776577
相关产品推荐
相关产品推荐

