Android WebView中mailto链接触发ERR_UNKNOWN_URL_SCHEME错误求助
解决Android WebView中mailto链接报错ERR_UNKNOWN_URL_SCHEME的问题
这个问题我之前也碰到过,核心原因是WebView默认只会处理http/https协议的URL,像mailto、tel这类特殊的URL Scheme,它没有内置的处理逻辑,所以点击时就会抛出ERR_UNKNOWN_URL_SCHEME错误。
要解决这个问题,你需要自定义WebViewClient来拦截并处理mailto链接,具体步骤如下:
1. 自定义WebViewClient,拦截mailto链接
重写shouldOverrideUrlLoading方法,判断链接的协议类型,如果是mailto开头,就调用系统邮件应用来处理:
WebView webView = (WebView) findViewById(R.id.webView); // 自定义WebViewClient处理特殊链接 webView.setWebViewClient(new WebViewClient() { // 兼容Android 6.0及以下版本 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { handleSpecialUrl(url); return true; } // 兼容Android 7.0及以上版本 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); handleSpecialUrl(url); return true; } // 统一处理特殊URL的方法 private void handleSpecialUrl(String url) { if (url.startsWith("mailto:")) { // 调用系统邮件应用 Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse(url)); // 防止没有邮件应用的情况 if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } } else { // 普通http/https链接正常加载 webView.loadUrl(url); } } }); // 加载本地HTML文件 webView.loadUrl("file:///android_asset/info.html");
2. 补充说明
- 为什么原来的代码不行?因为默认的
WebViewClient没有处理mailto这类非http协议的链接,WebView会尝试直接加载这个URL,自然就报错了。 - 代码里加了
intent.resolveActivity判断,是为了避免用户设备上没有安装邮件应用时崩溃。 - HTML里的
target="_blank"对mailto链接来说没什么影响,因为我们已经拦截并跳转到系统应用了,不需要WebView打开新窗口。
内容的提问来源于stack exchange,提问作者Jaime Alcántara Arnela
相关产品推荐
相关产品推荐

