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();
我正在研究 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();