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

WebView无法打开外部URL新标签页问题排查

问题分析与解决方案

你的代码存在两个核心问题,导致Stripe认证的新页面无法正常加载显示:

1. 无效的提前添加WebView操作

代码开头的webView.addView(newWebView)完全错误——这里的newWebView未初始化,会直接触发空指针异常,且逻辑上毫无意义:新WebView应该在创建窗口的回调里生成后再添加到布局,而非提前无意义地调用。直接删除这行代码。

2. 新WebView未加入视图层级

你在onCreateWindow里创建了新WebView,但仅将其赋值给WebViewTransport,却没有把这个WebView添加到当前Activity的布局容器中。未加入视图层级的WebView不会被系统渲染,自然看不到OTP输入页面,也无法进行交互。

修改后的完整代码示例

webView.settings.setSupportZoom(true)
webView.settings.javaScriptEnabled = true
webView.settings.offscreenPreRaster = true
webView.settings.setSupportMultipleWindows(true)
webView.settings.javaScriptCanOpenWindowsAutomatically = true

webView.webChromeClient = object : WebChromeClient() {
    override fun onCreateWindow(view: WebView?, isDialog: Boolean, isUserGesture: Boolean, resultMsg: Message?): Boolean {
        val newWebView = WebView(requireActivity())
        newWebView.settings.setSupportZoom(true)
        newWebView.settings.loadWithOverviewMode = true
        newWebView.settings.javaScriptEnabled = true
        newWebView.settings.offscreenPreRaster = true
        newWebView.settings.setSupportMultipleWindows(true)
        newWebView.settings.javaScriptCanOpenWindowsAutomatically = true
        // 配置布局参数,让新WebView占满屏幕
        val params = FrameLayout.LayoutParams(
            ViewGroup.LayoutParams.MATCH_PARENT,
            ViewGroup.LayoutParams.MATCH_PARENT
        )
        newWebView.layoutParams = params

        newWebView.webViewClient = object : WebViewClient() {
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
            }

            override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean {
                val newUrl = request?.url?.toString()
                val browserIntent = Intent(Intent.ACTION_VIEW)
                browserIntent.data = Uri.parse(newUrl)
                startActivity(browserIntent)
                return true
            }

            override fun onReceivedSslError(view: WebView?, handler: SslErrorHandler?, error: SslError?) {
                handler?.proceed()
            }
        }

        // 将新WebView添加到Activity的根布局中
        val rootLayout = requireActivity().findViewById<ViewGroup>(android.R.id.content)
        rootLayout.addView(newWebView)

        val transport = resultMsg?.obj as? WebView.WebViewTransport
        transport?.webView = newWebView
        resultMsg?.sendToTarget()

        return true
    }
}

额外优化建议

  • 若想让新窗口以弹窗形式展示,可调整LayoutParams设置宽高为屏幕的80%,并添加背景、圆角等样式。
  • 在页面销毁时记得移除动态添加的WebView,避免内存泄漏。
  • Stripe认证流程可能需要第三方Cookie支持,可添加配置:newWebView.settings.allowThirdPartyCookies = true(Android 11及以上需在Manifest中配置相关权限)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:05:21