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

