You need to enable JavaScript to run this app. Xamarin.Forms调用GetAuthenticationTypeAsync安卓返回无效类型求解决方案
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms调用GetAuthenticationTypeAsync安卓返回无效类型求解决方案

Xamarin.Forms Android端Plugin.Fingerprint认证类型获取异常解决方案

问题原因

Plugin.Fingerprint包的Android端实现在API 30+系统上,未适配多生物识别共存的场景,导致GetAuthenticationTypeAsync()返回无效枚举值,iOS端逻辑不受影响。

解决方案1:通过依赖服务原生实现认证类型查询(推荐)

步骤1:共享项目定义公共接口

在共享项目中新增生物识别服务接口:

public enum CustomAuthType
{
    None,
    Fingerprint,
    Face,
    Multiple
}

public interface IBiometricAuthService
{
    Task<CustomAuthType> GetSupportedAuthTypeAsync();
}

步骤2:Android项目实现接口

Android端直接调用系统原生BiometricManager完成查询,首先在AndroidManifest.xml中添加权限:

<uses-permission android:name="android.permission.USE_BIOMETRIC" />

然后实现接口:

[assembly: Dependency(typeof(BiometricAuthService_Android))]
namespace YourAppNamespace.Droid
{
    public class BiometricAuthService_Android : IBiometricAuthService
    {
        public async Task<CustomAuthType> GetSupportedAuthTypeAsync()
        {
            if (Build.VERSION.SdkInt < BuildVersionCodes.M)
                return CustomAuthType.None;
            
            var biometricManager = AndroidX.Biometric.BiometricManager.From(Android.App.Application.Context);
            var canAuth = biometricManager.CanAuthenticate(AndroidX.Biometric.BiometricManager.Authenticators.BiometricStrong);
            if (canAuth != BiometricManager.BiometricSuccess)
                return CustomAuthType.None;

            // 分别判断指纹和面容支持情况
            bool hasFingerprint = false;
            bool hasFace = false;

            var packageManager = Android.App.Application.Context.PackageManager;
            hasFingerprint = packageManager.HasSystemFeature(Android.Content.PM.PackageManager.FeatureFingerprint);
            if (Build.VERSION.SdkInt >= BuildVersionCodes.Q)
            {
                hasFace = packageManager.HasSystemFeature(Android.Content.PM.PackageManager.FeatureFace);
            }

            if (hasFingerprint && hasFace)
                return CustomAuthType.Multiple;
            else if (hasFingerprint)
                return CustomAuthType.Fingerprint;
            else if (hasFace)
                return CustomAuthType.Face;
            else
                return CustomAuthType.None;
        }
    }
}

步骤3:iOS项目实现接口

iOS端直接复用原有插件的正常逻辑即可:

[assembly: Dependency(typeof(BiometricAuthService_iOS))]
namespace YourAppNamespace.iOS
{
    public class BiometricAuthService_iOS : IBiometricAuthService
    {
        public async Task<CustomAuthType> GetSupportedAuthTypeAsync()
        {
            var authType = await CrossFingerprint.Current.GetAuthenticationTypeAsync();
            return authType switch
            {
                AuthenticationType.Face => CustomAuthType.Face,
                AuthenticationType.Fingerprint => CustomAuthType.Fingerprint,
                _ => CustomAuthType.None
            };
        }
    }
}

步骤4:共享项目调用

替换原有调用逻辑,直接通过依赖服务获取:

var authService = DependencyService.Get<IBiometricAuthService>();
var authType = await authService.GetSupportedAuthTypeAsync();
if(authType == CustomAuthType.Face)
{ 
    // 面容识别逻辑
}
else if(authType == CustomAuthType.Fingerprint)
{
    // 指纹识别逻辑
}

解决方案2:轻量兼容写法(无需依赖服务)

如果不需要严格区分面容和指纹,仅需要判断是否有可用的生物认证,可以直接绕开类型查询接口:

// 仅判断是否有可用的生物认证,不需要区分类型的场景
var isBiometricAvailable = await CrossFingerprint.Current.IsAvailableAsync();
if (isBiometricAvailable)
{
    // 直接发起认证即可,插件会自动调用系统支持的认证方式
    var result = await CrossFingerprint.Current.AuthenticateAsync("验证身份");
}

注意事项

  • 优先将Plugin.Fingerprint升级到最新稳定版,部分新版本已经修复了主流机型的Android端类型返回问题
  • Android 12及以上系统需要动态申请生物识别相关权限,否则会返回认证不可用
  • 如果你的应用不需要区分生物认证类型,优先使用解决方案2,实现成本最低

内容的提问来源于stack exchange,提问作者DotNetUser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 15:15:01