You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:00:00