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

Android WebView跳转WhatsApp报ERR_UNKNOWN_URL_SCHEME错误

错误原因

Android系统WebView默认仅支持http、https标准网页传输协议,遇到whatsapp://这类应用自定义的URL Scheme时,会默认尝试在WebView内部加载该地址,因无法识别协议类型就会抛出net::ERR_UNKNOWN_URL_SCHEME报错。当前实现的WebViewClient没有对非标准网页协议的链接做拦截分发,是导致跳转失败的直接原因。

修复方法

在自定义的WebViewClient中重写shouldOverrideUrlLoading方法,对跳转链接做协议判断:

  • 链接为http/https协议时,正常交由WebView内部加载
  • 链接为其他自定义协议时,通过系统Intent唤起支持该协议的对应应用处理,不放在WebView内加载
  • 增加异常捕获,避免用户设备未安装目标应用时触发崩溃
修复后完整实现代码
import android.content.ActivityNotFoundException;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    WebView web;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        web = findViewById(R.id.webView);
        WebSettings webSettings = web.getSettings();
        webSettings.setJavaScriptEnabled(true);
        web.setWebViewClient(new Callback());
        web.loadUrl("https://smartfix.pk/");
    }


    private class Callback extends WebViewClient {
        @Override
        public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
            return false;
        }

        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            String url = request.getUrl().toString();
            return handleCustomSchemeUrl(view, url);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return handleCustomSchemeUrl(view, url);
        }

        private boolean handleCustomSchemeUrl(WebView view, String url) {
            // 标准http/https链接交给WebView加载
            if (url.startsWith("http://") || url.startsWith("https://")) {
                return false;
            }
            // 自定义协议链接交给系统唤起对应应用
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                view.getContext().startActivity(intent);
            } catch (ActivityNotFoundException e) {
                // 可在此处添加提示逻辑,比如告知用户未安装对应应用
                e.printStackTrace();
            }
            return true;
        }
    }
}
补充说明

上述实现是通用处理逻辑,除了WhatsApp跳转外,也会自动兼容页面中其他自定义协议跳转,包括拨打电话tel://、发送邮件mailto://、跳转其他第三方应用的场景。如果只需要单独放行WhatsApp跳转,可以在handleCustomSchemeUrl方法中增加协议前缀判断,仅对whatsapp://开头的链接做Intent唤起处理即可。

内容的提问来源于stack exchange,提问作者Syed Shahrose

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:54:18