Xamarin Android C# WebView打开whatsapp://链接提示net::ERR_UNKNOWN_URL_SCHEME错误求助
解决Xamarin Android WebView中whatsapp://链接的net::ERR_UNKNOWN_URL_SCHEME错误
嘿,刚接触Xamarin Android开发遇到这个问题太正常了!我来帮你理清楚问题出在哪,以及怎么快速解决:
问题根源
WebView默认只认http://、https://这类标准网络协议,像whatsapp://这种自定义的URL Scheme,它不知道该怎么处理,直接加载就会抛出net::ERR_UNKNOWN_URL_SCHEME错误。你之前看的tel链接解决方案思路是对的,只是需要适配到whatsapp的场景上。
解决方案
我们要在WebViewClient的ShouldOverrideUrlLoading方法里,单独判断并处理自定义协议的链接:当检测到是whatsapp://开头的链接时,用Android的Intent去唤起对应的应用,而不是让WebView自己加载。
下面是修改后的完整代码,我标注了关键修改部分:
using System; using Android.App; using Android.Content; using Android.Runtime; using Android.Views; using Android.Webkit; using Android.Widget; using Android.OS; namespace IwI { [Activity(Label = "IwI", MainLauncher = true, Theme = "@android:style/Theme.NoTitleBar")] public class MainActivity : Activity { WebView web_view; protected override void OnCreate(Bundle bundle) { RequestWindowFeature(WindowFeatures.NoTitle); base.OnCreate(bundle); SetContentView(Resource.Layout.Main); web_view = FindViewById<WebView>(Resource.Id.webview); web_view.Settings.JavaScriptEnabled = true; web_view.SetWebViewClient(new IwIClient()); web_view.LoadUrl("https://jacidd.com/iwi"); } public class IwIClient : WebViewClient { public override bool ShouldOverrideUrlLoading(WebView view, IWebResourceRequest request) { string url = request.Url.ToString(); // 关键修改:识别whatsapp自定义协议 if (url.StartsWith("whatsapp://")) { // 创建Intent唤起WhatsApp应用 Intent intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse(url)); Context context = view.Context; // 检查设备是否有能处理该Intent的应用(避免无WhatsApp时崩溃) if (intent.ResolveActivity(context.PackageManager) != null) { context.StartActivity(intent); } else { // 无WhatsApp时给用户友好提示 Toast.MakeText(context, "请先安装WhatsApp应用", ToastLength.Short).Show(); } // 返回true表示我们已处理该链接,无需WebView加载 return true; } // 标准http/https链接,让WebView正常加载 view.LoadUrl(url); return false; } } public override bool OnKeyDown(Android.Views.Keycode keyCode, Android.Views.KeyEvent e) { if (keyCode == Keycode.Back && web_view.CanGoBack()) { web_view.GoBack(); return true; } return base.OnKeyDown(keyCode, e); } } }
额外小贴士
- 这个逻辑同样适用于其他自定义协议,比如
tel://、sms://,只需要修改StartsWith里的判断条件就行。 ResolveActivity的检查一定要加,能避免用户没装WhatsApp时应用崩溃,还能给用户明确引导。- 返回
true是核心:告诉WebView“这个链接我来处理,你不用管了”,从根源上避免错误抛出。
内容的提问来源于stack exchange,提问作者The Ambidextrous
相关产品推荐
相关产品推荐

