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

WebView通过Intent拨打电话报错:net:ERR_UNKNOWN_URL_SCHEME求助

解决WebView中tel链接报错net:ERR_UNKNOWN_URL_SCHEME的问题

嘿,我帮你排查下这个tel链接的问题!你说用了内部类还是没解决,大概率是WebViewClient的重写逻辑没处理到位,或者没覆盖到所有版本的兼容情况。我给你一套靠谱的实现方案,一步步来:

核心问题原因

WebView默认只处理http/https开头的URL,像tel:、mailto:这类自定义URL Scheme,WebView不知道怎么处理,就会抛出net:ERR_UNKNOWN_URL_SCHEME错误。我们需要手动拦截这类链接,交给系统应用去处理。

正确的实现代码

下面是完整的WebActivity代码,用内部类实现WebViewClient,同时兼容Android 7.0以上和以下的版本:

public class WebActivity extends AppCompatActivity {
    private static final String TEL_PREFIX = "tel:";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web);

        WebView webView = findViewById(R.id.web_view);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true); // 如果你的网页需要JS支持,记得打开

        // 关键:设置自定义的WebViewClient,拦截URL处理
        webView.setWebViewClient(new WebViewClient() {
            // 处理Android 6.0及以下系统的URL拦截
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                return handleCustomUrl(url);
            }

            // 处理Android 7.0及以上系统的URL拦截(新的重载方法)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                String url = request.getUrl().toString();
                return handleCustomUrl(url);
            }

            // 统一处理自定义Scheme的逻辑
            private boolean handleCustomUrl(String url) {
                // 拦截tel开头的链接
                if (url.startsWith(TEL_PREFIX)) {
                    // 调用系统拨号界面(不用申请CALL权限,ACTION_DIAL是安全的)
                    Intent dialIntent = new Intent(Intent.ACTION_DIAL);
                    dialIntent.setData(Uri.parse(url));
                    startActivity(dialIntent);
                    // 返回true表示我们自己处理了这个链接,WebView无需再加载
                    return true;
                }
                // 其他http/https链接,交给WebView正常加载
                return false;
            }
        });

        // 加载你的目标网页
        webView.loadUrl("https://your-target-url.com");
    }
}

容易踩坑的注意点

  • 必须设置自定义WebViewClient:如果你的WebView用了默认的WebViewClient,或者后来被其他代码覆盖了,拦截逻辑就不会生效。
  • 覆盖两个重载方法:Android 7.0之后,系统新增了带WebResourceRequest参数的shouldOverrideUrlLoading方法,只重写旧方法会导致高版本系统不触发拦截。
  • 处理URL的异常情况:如果网页里的tel链接有空格或非法字符,可以在handleCustomUrl里先做下清理,比如url = url.trim();。
  • 权限问题:用ACTION_DIAL不需要申请CALL_PHONE权限,系统会打开拨号界面让用户手动发起呼叫;如果用ACTION_CALL才需要权限,但不推荐直接调用,因为会跳过用户确认。

内容的提问来源于stack exchange,提问作者Manu Bhogal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:40:49