天天看点

安卓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