HTML5 混合 APP 需要在 H5 页面中打开第三方网站(例如:百度),android 默认不在当前 WebView 中打开,反而会调用系统或外部浏览器,解决办法是自己重写 WebViewClient,覆盖 shouldOverrideUrlLoading 并让其返回 True。
实现代码
mWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
//webview 自己加载 URL,然后通知系统不需要 HandleURL
view.loadUrl(url);
return true;
}
});
原因可以从 Android 源代码中可知,True 表示宿主应用程序希望离开当前 WebView 并自行处理 URL,否则返回 false。
/** 在当前 WebView 中加载新 URL 之前,给宿主应用程序一个机会接管控制权。
* 如果没有提供 WebViewClient,默认情况下 WebView 会要求 Activity Manager 为 URL 选择适当的处理程序。
* 如果提供了 WebViewClient,返回 true 表示宿主应用程序处理 URL,而返回 false 表示当前 WebView 处理 URL。
* 对于使用 POST 方法的请求,不会调用此方法。
@param view 发起回调的 WebView。
@param url 要加载的 URL。
@return True 表示宿主应用程序希望离开当前 WebView 并自行处理 URL,否则返回 false。
*/
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
需要注意一点问题,如果你的代码中有拨打电话(tel:),发送邮件 (mailto:) 的话,需要在实现代码时对 URL 进行简单筛选才好。