You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 13:30:55