Android中的WebView中載入非Http(s)的URL導致net::ERR_UNKNOWN_URL_SCHEME

2020-10-16 12:00:53

最近開發遇到載入一個百度網路硬碟的URL(載入的URL為https開頭的),使用的是Android應用中WebView來載入實現的,就出現了net::ERR_UNKNOWN_URL_SCHEME的錯誤:如下圖:

一、出現的原因

因為webview只能識別http, https這樣的協定,像一些支付寶(alipays://)、微信(weixin://)、去哪兒(qunaraphone://),他們自定義的協定webView是無法識別的,因此就會出現:ERR_UNKNOWN_URL_SCHEME這樣的錯誤。

一般會「位於:………………的網頁無法載入,因為 net:ERR_UNKNOWN_URL_SCHEME」,在這裡我們就可以看到無法開啟的協定。

二、解決的方法為

給WebView設定WebViewClient,並重寫WebViewClient中的shouldOverrideUrlLoading方法.
首先我們來了解下shouldOverrideUrlLoading(WebView view, String url)方法,該方法會在載入超連結時回撥過來,所以通過重寫shouldOverrideUrlLoading,可以實現對網頁中超連結的攔截;返回值為boolean型,是true的時候控制去WebView開啟,為false呼叫系統瀏覽器或第三方瀏覽器。預設false

所以,我們可能在有的博文中看到不去重寫該方法也可以解決ERR_UNKNOWN_URL_SCHEME這個錯誤。
這裡我們講下重寫shouldOverrideUrlLoading來解決。

 webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url == null) return false;

                try{
                    if(!url.startsWith("http://") && !url.startsWith("https://")){
                        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                        startActivity(intent);
                        return true;
                    }
                }catch (Exception e){//防止crash (如果手機上沒有安裝處理某個scheme開頭的url的APP, 會導致crash)
                    return true;//沒有安裝該app時,返回true,表示攔截自定義連結,但不跳轉,避免彈出上面的錯誤頁面
                }

                //下面的兩種方式選擇使用其中一種即可
                // TODO Auto-generated method stub
                //1:返回值是true的時候控制去WebView開啟,為false呼叫系統瀏覽器或第三方瀏覽器
                view.loadUrl(url);
                return true;
                //2:或者使用如下的載入方式:
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

3:終極解決方案:

如果上述方法使用不行的話,直接在該介面的原生WebView替換成 騰訊客製化版的WebView(com.tencent.smtt.sdk.WebView)

再次嘗試基本可以解決。