安卓app的webView加载网页后出现ERR_UNKNOWN_URL_SCHEME
进来开发需要,欲于app中加入百度地图导航功能,然时间紧迫,遂以嵌入网页为先。
然在使用webView加载网页过程中,遇到了如上问题,显示ERR_UNKNOWN_URL_SCHEME
不知何故之下,学网上删去webView.setWebViewClient(new WebViewClient(){...}
,并加上webView.setWebChromeClient(new WebChromeClient());
的确可以正确显示了,但是尝试后,发现点击链接会自动跳转手机浏览器,而不继续在这儿显示了,这显然不是我所希望的。
但是想让网页只在我的webview内跳转,而不要跑到手机浏览器去了,那么就需要用到如下代码:
webView.setWebViewClient(new WebViewClient(){
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
是的,这正是前面删掉的嘛,而且只要加了这东西,即便加上webView.setWebChromeClient(new WebChromeClient());
也是无用,一样的报错。
难道无解了吗?不不不,上述方法既不治标也不治本,而真正治本的方法如下:
首先我们观察一下错误显示:
发现了吗,位于baidumap://xxx
的网页无法加载,明明输入的是http://xxx
为何变成了这个开头?
这是因为其自定义了scheme,类似的还有alipays://
,weixin://
等等。而webView只能识别http://
或https://
开头的url,因此才会报此错。
想处理也很简单,对于这种自定义scheme的url单独处理即可。
以我的baidumap://
为例,修改代码如下:
webView.setWebViewClient(new WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
try{
if(url.startsWith("baidumap://")){
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
}
}catch (Exception e){
return false;
}
webView.loadUrl(url);
return true;
}
});
另外那个webView.setWebChromeClient(new WebChromeClient());
得删去啦。
上述是只针对以baidumap://
开头的scheme,如果当前页面显示的网站是固定的,那么也如此操作即可,而如果需要做成一个类似浏览器的形式,只需判断开头是否是http://
或https://
,如若不是,则将上面的try...catch
中代码复制进去,删去if
判断即可。