進來開發需要,欲于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());
也是無用,一樣的報錯。
難道無解了嗎?不不不,上述方法既不治标也不治本,而真正治本的方法如下:
首先我們觀察一下錯誤顯示:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAnYldHL0FWby9mZvwFN4ETMfdHLkVGepZ2XtxSZ6l2clJ3LcV2Zh1Wa9M3clN2byBXLzN3btgHL9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN3QjN5gDOlFDM2MmY0AjNzYzX4EzNyYDMxAzLcFTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
發現了嗎,位于
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
判斷即可。