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

问题描述 投票:0回答:2
public boolean onCreateWindow(WebView view, boolean dialog, boolean userGesture, Message resultMsg)

我在 StackOverflow 找到了一种方法,但它没有获得“window.open('example.com')”url。

Message href = view.getHandler().obtainMessage();
view.requestFocusNodeHref(href);
String url = href.getData().getString("url");

// Only get "<a href='example.com' target='_blank'>" url.
javascript java android webview android-webview
2个回答
0
投票

您确定在网络视图的设置中启用了多个窗口吗?:

settings.setSupportMultipleWindows(true)


0
投票

webChromeClient 在创建新窗口时不会公开所点击链接的 URL。 如果您需要处理点击的 URL,处理 window.open() 情况的唯一方法是通过 webViewClient 的 shouldOverrideUrlLoading,如下所示:

webChromeClient = object : WebChromeClient() {
    override fun onCloseWindow(window: WebView?) {
        super.onCloseWindow(window)
    }

    override fun onCreateWindow(
        view: WebView?,
        isDialog: Boolean,
        isUserGesture: Boolean,
        resultMsg: Message?
    ): Boolean {

        if (view?.context == null) {
            return false
        }
        if (resultMsg == null) {
            return false
        }

        // Use CustomTabs to open the link when the hitTestResult is not null
        if (view.hitTestResult.extra != null) {
            val colorParam = CustomTabColorSchemeParams.Builder().setToolbarColor(getColor(context, R.color.nifty_blue)).build()
            val intent = CustomTabsIntent.Builder()
                .setDefaultColorSchemeParams(colorParam)
                .setShowTitle(true)
                .build()
            intent.launchUrl(view.context, Uri.parse(view.hitTestResult.extra))
            return false
        }

        // Use a new webViewClient to handle window.open() case
        val newWebView = WebView(view.context)
        newWebView.webViewClient = object : WebViewClient() {
            override fun shouldOverrideUrlLoading(
                view: WebView?,
                request: WebResourceRequest?
            ): Boolean {
                if (request?.url == null) {
                    return true
                }
                val url = request.url.toString()
                if (url.contains("example.com")) {
                    // Here you can handle “example.com” and do whatever you want
                    return true
                }
                return true
            }
        }
        val transport = resultMsg.obj as WebView.WebViewTransport
        transport.webView = newWebView
        resultMsg.sendToTarget()

        return true
    }
}

对了,别忘了给WebView添加JS设置。

webView.apply {
    settings.javaScriptEnabled = true
    settings.javaScriptCanOpenWindowsAutomatically = true
    settings.setSupportMultipleWindows(true)
}

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.