天天看點

安卓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());​

​ 也是無用,一樣的報錯。

難道無解了嗎?不不不,上述方法既不治标也不治本,而真正治本的方法如下:

首先我們觀察一下錯誤顯示:

安卓app的webView加載網頁後出現ERR_UNKNOWN_URL_SCHEME

發現了嗎,位于​

​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​

​判斷即可。

安卓app的webView加載網頁後出現ERR_UNKNOWN_URL_SCHEME