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
相关产品推荐
相关产品推荐

