WebView无法调起微信、支付宝 (net::ERR_UNKNOWN_URL_SCHEME)

一. 问题
最近app出了个问题, 就是在webview中无法调起微信、支付宝。
错误页面如下:

WebView无法调起微信、支付宝 (net::ERR_UNKNOWN_URL_SCHEME)_第1张图片
failed.png

可以看到两个失败的页面加载的url都是自定义scheme开头的(alipays://weixin://)。webview只能识别http://https://开头的url, 因此如果要识别其他的scheme (如: alipays、weixin、mailto、tel ... 等等), 你就要自行处理. 一般其他的scheme都是由原生APP处理, 即用一个Intent去调起能处理此scheme开头的url的APP. 代码如下:

//customUrl是一个由自定义的scheme开头的url, 如: alipays://appid=2387834&user=......
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(customUrl));
startActivity(intent);

APP中, 如果你的某个页面要支持某个scheme可以像如下这样定义:

Gmail中自定义的scheme


    
        
        
        
        
         
    
    
        
        
        
    
    
        
        
        
         
    
    
        
        
        
        
    
    
        
        
        
        
    
    
        
        
        
    

微信中自定义的scheme


    
         
        
        
        
    

必须注意的是, 用intent处理自定义的scheme开头的url时, 代码必须加上try...catch... , 应为如果你的手机上没有安装处理那个scheme的应用 (整个手机上没有一个应用能处理那个scheme), 那么就会crash (这跟隐式启动Activity是一个道理) !!!

二. 解决方法

给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://")
               //其他自定义的scheme
            ) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent);
                return true;
            }
        } catch (Exception e) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
            return false;
        }

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

关于自定义Scheme可以参考官网说明: https://developer.android.com/training/basics/intents/filters.html

你可能感兴趣的:(WebView无法调起微信、支付宝 (net::ERR_UNKNOWN_URL_SCHEME))