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
相关产品推荐
相关产品推荐

