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

Android WebView出现net::ERR_UNKNOWN_URL_SCHEME错误求助

解决WebView的net::ERR_UNKNOWN_URL_SCHEME错误

你遇到的问题根源很明确:WebView默认只支持http/https这类标准网页协议,像Telegram的tg://、mailto:、tel:这类非网页协议,它没法直接处理,就会抛出这个错误。

直接修改你代码里的两处关键地方就能解决:

1. 启用自定义的MywebClient

你代码里已经定义了MywebClient但没实际使用,把webView.setWebViewClient(new WebViewClient());替换成webView.setWebViewClient(new MywebClient());

2. 在shouldOverrideUrlLoading中处理非网页协议

重写这个方法,判断URL的协议类型:http/https让WebView自己加载,其他协议调用系统Intent打开外部应用,同时加异常捕获防止目标应用未安装导致崩溃。

修改后的完整代码:

package com.allcodingtutorial.mywebactivity;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MainActivity extends AppCompatActivity {
    WebView webView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = findViewById(R.id.webView);
        // 替换为自定义WebViewClient
        webView.setWebViewClient(new MywebClient());
        webView.loadUrl("https://vnexpress.net/");
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
    }

    public static class MywebClient extends WebViewClient{
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            String url = request.getUrl().toString();
            // 判断是否为标准网页协议
            if (url.startsWith("http://") || url.startsWith("https://")) {
                // 让WebView继续加载网页
                return false;
            } else {
                // 非网页协议,调用系统应用处理
                try {
                    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                    view.getContext().startActivity(intent);
                } catch (Exception e) {
                    // 可在此处添加Toast提示用户未安装对应应用
                    e.printStackTrace();
                }
                // 返回true表示已处理该URL,WebView无需再处理
                return true;
            }
        }
    }

    @Override
    public void onBackPressed() {
        if(webView.isFocused() && webView.canGoBack())
        {
            webView.goBack();
        }else{
            super.onBackPressed();
        }
    }
}

关键逻辑说明

  • 协议判断:通过startsWith筛选WebView能处理的http/https链接,返回false让WebView自行加载
  • 外部应用调用:用Intent.ACTION_VIEW启动系统默认应用处理自定义协议,比如tg://会唤起Telegram,tel:会唤起拨号界面
  • 异常捕获:避免用户未安装目标应用时出现崩溃,你可以在catch块中添加提示逻辑

内容的提问来源于stack exchange,提问作者cheapy kun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:31:08