Android 如何在默认浏览器中为 onCreateWindow 打开请求?

How to open request in default browser for onCreateWindow in Android?

我正在研究 Android/Kotlin WebView。我已经设置了,

 webView.webViewClient = MyWebViewClient(mContext)
 webView.webChromeClient = MyWebViewChromeClient(mContext)

val settings = webView.settings
    settings.userAgentString = "App Agent"
    settings.javaScriptCanOpenWindowsAutomatically = true
    settings.setSupportMultipleWindows(true)

现在,当新的 window 请求来自 Web 应用程序时,当前它正在打开新的 window 应用程序 webView 例如,

class MyWebViewChromeClient(private val mContext: BaseActivity): WebChromeClient() {

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

        val window = WebView(mContext)
        // set settings
        val parent: RelativeLayout? = mContext.findViewById<RelativeLayout>(R.id.mainLayout)
        parent?.removeAllViews()
        parent?.addView(window)

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

        return true
    }
}

那么,如何使用 Android 默认浏览器打开新的 window 请求?

onCreateWindow 方法中从下面的代码中获取 link 的 URL:

工作解决方案

override fun onCreateWindow(view: WebView?, isDialog: Boolean, isUserGesture: Boolean, resultMsg: Message?): Boolean {
    mContext.runOnUiThread {
        try {
            // here `url` parameter is the caller url
            mContext.startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(view.url))))
        }catch (e: Exception){
            EmrLogger.e(classTag, e)
        }
    }

    return true
}

mContext 是创建 webView 的上下文。

编辑

WebView newWebView = new WebView(getContext());
newWebView.setWebViewClient(new WebViewClient(){
    @Override
    public void onPageStarted(WebView view, String url,
            Bitmap favicon) {
         // Here param `url` is the target url
        super.onPageStarted(view, url, favicon);
    }
});
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget()

根据 Rahuls 的回答,我发现了一种可以更快的方法,您只需关闭网络负载,这样 webview 就不会加载,但会为您提供目标(如果您想要最后一个重定向的目标,只需离开加载)。 这对我有帮助,所以我认为它也可能对其他人有帮助。

WebView newWebView = new WebView(myActivity);
                newWebView.setWebViewClient(new WebViewClient(){
                    @Override
                    public void onPageStarted(WebView view, String url,
                                              Bitmap favicon) {
                        // Here param `url` is the target url

                        super.onPageStarted(view, url, favicon);

                        view.destroy();
                    }
                });
                newWebView.setNetworkAvailable(false);
                newWebView.getSettings().setBlockNetworkLoads(true);
                WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
                transport.setWebView(newWebView);
                resultMsg.sendToTarget();