失败的页面加载的url都是自定义scheme开头的(alipays://、weixin://)。webview只能识别http://或https://开头的url, 因此如果要识别其他的scheme (如: alipays、weixin、mailto、tel ... 等等), 你就要自行处理. 一般其他的scheme都是由原生APP处理, 即用一个Intent去调起能处理此scheme开头的url的APP. 代码如下:
Intent intent =newIntent(Intent.ACTION_VIEW, Uri.parse(customUrl));
startActivity(intent);
用intent处理自定义的scheme开头的url时, 代码必须加上try...catch... , 应为如果你的手机上没有安装处理那个scheme的应用 (整个手机上没有一个应用能处理那个scheme), 那么就会crash (这跟隐式启动Activity是一个道理) !!!
二. 解决方法
给WebView设置WebViewClient并重写WebViewClient的shouldOverrideUrlLoading()方法
完整代码如下:
WebViewClient webViewClient =newWebViewClient(){
@OverridepublicbooleanshouldOverrideUrlLoading(WebView view, String url){
if(url ==null) return false;
if(url.startsWith("http://") || url.startsWith("https://") ) { //处理http和https开头的url
view.load(url);
return true;
} else{
try{
Intent intent =newIntent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
return true;
} catch(Exception e) { //防止crash (如果手机上没有安装处理某个scheme开头的url的APP, 会导致crash)
return false; }
}
};
webview.setWebViewClient(webViewClient);