安卓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()); 也是无用,一样的报错。

难道无解了吗?不不不,上述方法既不治标也不治本,而真正治本的方法如下:

首先我们观察一下错误显示:
这里写图片描述

发现了吗,位于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判断即可。


这里写图片描述



欢迎大家加入QQ群一起交流讨论,「吟游」程序人生——YinyouPoet

原文地址:https://www.cnblogs.com/yinyoupoet/p/13287532.html