Android WebView加载UPI支付链接报net::ERR_UNKNOWN_URL_SCHEME错误
问题根因
报错net::ERR_UNKNOWN_URL_SCHEME的核心原因是你写的shouldOverrideUrlLoading方法把所有链接都拦截后强制交给WebView加载,而upi://是Android系统级的自定义URI协议,不属于WebView能识别的http/https网页协议,自然加载失败。
普通移动端浏览器默认会对这类非网页协议做特殊处理,自动唤起匹配的UPI应用,但你的WebView代码没做分支判断,把UPI链接当普通网页加载才会出问题。
修复方法
修改WebViewClientDemo里的shouldOverrideUrlLoading逻辑,区分普通网页链接和自定义协议链接:http/https开头的链接继续在WebView内加载,upi这类自定义协议链接交给系统Intent唤起对应应用即可。
替换后的WebViewClientDemo代码如下:
private class WebViewClientDemo extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 普通网页链接走WebView内部加载 if (url.startsWith("http://") || url.startsWith("https://")) { view.loadUrl(url); return true; } // 自定义协议链接交给系统处理 else { try { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(intent); } catch (ActivityNotFoundException e) { // 用户没装UPI应用时弹提示,避免崩溃 Toast.makeText(MainActivity.this, "当前设备未安装UPI支付应用,请安装后重试", Toast.LENGTH_SHORT).show(); } return true; } } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mySwipeRefreshLayout.setRefreshing(false); } }
补充说明
- 需要先在代码文件头部导入缺失的依赖类:
android.content.Intent、android.net.Uri、android.content.ActivityNotFoundException、android.widget.Toast - 上述逻辑是通用处理,后续遇到
tel:(拨打电话)、mailto:(发邮件)、WhatsApp跳转链接这类非http/https链接,都会自动交给系统匹配对应应用打开,不会再报未知协议错误 - 如果需要做严格限制,也可以在else分支里先判断
url.startsWith("upi://")再放行,其他非白名单协议直接拦截即可
内容的提问来源于stack exchange,提问作者gaurav bhatia
相关产品推荐
相关产品推荐

