android webview加载alipays:// scheme失败的解决方案
在Android应用开发中,WebView常用于加载网页内容。然而,加载自定义URL scheme(例如alipays://)时,经常遇到net::err_unknown_url_scheme错误,即使重写了shouldOverrideUrlLoading方法,onReceivedError回调中仍可能返回errorCode为-10的错误。这是因为WebView默认不支持自定义URL scheme,需要特殊处理。
本文提供有效的解决方案。关键在于正确重写WebViewClient的shouldOverrideUrlLoading方法,拦截并处理自定义URL scheme。
一些开发者可能已尝试重写shouldOverrideUrlLoading,但仍未解决问题。这是因为实现方法可能存在错误。正确的实现如下:
首先,为WebView设置WebViewClient,并重写shouldOverrideUrlLoading方法。在这个方法中,判断URL是否以”alipays://”开头。如果是,则创建一个Intent,使用Intent.ACTION_VIEW和Uri.parse(url)启动支付宝应用。如果支付宝应用未安装,则会捕获ActivityNotFoundException异常。最后,返回true表示已处理该URL,WebView无需继续加载。如果不是自定义scheme,则调用父类的shouldOverrideUrlLoading方法,让WebView使用默认行为。
以下代码片段演示了正确的实现:
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (url.startsWith("alipays://")) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); try { startActivity(intent); } catch (ActivityNotFoundException e) { // 处理支付宝应用未安装的情况,例如提示用户安装 Toast.makeText(context, "请安装支付宝", Toast.LENGTH_SHORT).show(); } return true; } return super.shouldOverrideUrlLoading(view, url); } });
通过以上代码,WebView就能正确处理alipays:// scheme的URL,避免net::err_unknown_url_scheme错误。 可以根据实际需求调整ActivityNotFoundException的异常处理方式,例如向用户显示更友好的错误提示。 onReceivedError方法在此示例中已省略,因为错误处理已在shouldOverrideUrlLoading中完成。