進來開發需要,欲於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
判斷即可。