为何OnePlus AC2001 Android11(API-30)调用PhoneDialer.Open抛出FeatureNotSupportedException
问题原因
Android 11(API 30)引入了包可见性限制,应用默认无法感知系统中能处理拨号意图的应用,会导致Xamarin.Essentials的PhoneDialer功能误判当前设备不支持拨号,抛出FeatureNotSupportedException,和设备本身的硬件支持无关。
解决方案
按以下步骤依次排查修复即可:
- 第一步:配置AndroidManifest.xml
打开安卓项目下的Properties/AndroidManifest.xml文件,在manifest根节点下新增包可见性配置:
如果你的应用需要实现直接拨打电话的功能(而非仅调起拨号页),额外添加权限声明:<queries> <intent> <action android:name="android.intent.action.DIAL" /> <data android:scheme="tel" /> </intent> </queries><uses-permission android:name="android.permission.CALL_PHONE" /> - 第二步:检查Xamarin.Essentials初始化逻辑
打开安卓项目的MainActivity.cs文件,确认OnCreate方法中已添加初始化代码:
同时确认已重写protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // 必须保留这行初始化代码 Xamarin.Essentials.Platform.Init(this, savedInstanceState); LoadApplication(new App()); }OnRequestPermissionsResult方法,转发权限处理结果给Essentials:public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults) { Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); base.OnRequestPermissionsResult(requestCode, permissions, grantResults); } - 第三步:校验号码格式
调用PhoneDialer.Open前先清洗translatedNumber,仅保留数字、+、-三类合法字符,移除空格、字母、特殊符号等无效内容。 - 备选降级方案
若以上配置全部完成后仍报错,可以直接调用安卓原生API调起拨号页:var intent = new Intent(Intent.ActionDial, Android.Net.Uri.Parse($"tel:{translatedNumber}")); intent.AddFlags(ActivityFlags.NewTask); Android.App.Application.Context.StartActivity(intent);
内容的提问来源于stack exchange,提问作者Anirudh Singh Rawat
相关产品推荐
相关产品推荐

