WebView出现net::ERR_UNKNOWN_URL_SCHEME错误

1.问题分析

最近app中集成了一个大众点评的外链,但跳转到“商户详情”页面就会出现如下错误页面,仔细观察图中url可以发现这是一个自定协议的url,究其原因,就是拦截webview中的url, 如果url是自定义协议(如: tel, weixin, alipays 等等)开头的, 就url转换成原生调用(intent跳转), 因为webview只能识别http, https这样的协议. webview其实就相当于pc端的浏览器, 遇到http/https开头的url时会向host发起一个请求, 而遇到自定义的协议时就不知道该如何处理了, 因此就会出现ERR_UNKNOWN_URL_SCHEME这样的错误。


WebView出现net::ERR_UNKNOWN_URL_SCHEME错误_第1张图片

2.解决方法

给WebView设置WebViewClient,并重写WebViewClient中的shouldOverrideUrlLoading方法

WebViewClient webViewClient = new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView wv, String url) {
        if(url == null) return false;

        try {
            if(url.startsWith("weixin://") //微信
                  || url.startsWith("alipays://") //支付宝
                  || url.startsWith("mailto://") //邮件
                  || url.startsWith("tel://")//电话
                  || url.startsWith("dianping://")//大众点评
                  //其他自定义的scheme
              ) {
                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,表示拦截自定义链接,但不跳转,避免弹出上面的错误页面
        }

        //处理http和https开头的url
        wv.loadUrl(url);
        return true;
    }
};
webview.setWebViewClient(webViewClient);

你可能感兴趣的:(WebView出现net::ERR_UNKNOWN_URL_SCHEME错误)