MAUI安卓使用Plugin.Fingerprint实现生物识别遇异常求助
在MAUI安卓应用中使用Plugin.Fingerprint时的Resolver异常解决办法
问题详情
在MAUI安卓应用中使用Plugin.Fingerprint实现生物识别功能时,抛出System.InvalidOperationException异常,提示信息:
Resolver for the current activity is not set. Call Fingerprint.SetCurrentActivityResolver somewhere in your startup code
但开发者已在MainActivity的OnCreate方法中调用了CrossFingerprint.SetCurrentActivityResolver(() => this),相关代码如下:
MainActivity.cs代码
namespace dummy { [Activity(Theme = "@style/Maui.SplashTheme", MainLauncher = true, LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density, Exported = true)] public class MainActivity : MauiAppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); CrossFingerprint.SetCurrentActivityResolver(() => this); } public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults) { base.OnRequestPermissionsResult(requestCode, permissions, grantResults); Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults); } } }
生物识别实现代码
public async Task biometric() { try { var availability = await CrossFingerprint.Current.IsAvailableAsync(); if (!availability) { //await MainThread.InvokeOnMainThreadAsync(async () => //{ // await DisplayAlert("Warning!", "No biometrics available", "OK"); //}); return; } var authResult = await CrossFingerprint.Current.AuthenticateAsync( new AuthenticationRequestConfiguration( "Login to dummy", "Unlock your device to use dummy.")); if (authResult.Authenticated) { if (!string.IsNullOrEmpty(usrname) && !string.IsNullOrEmpty(pasword)) { AutoLogin(usrname, pasword); } else { await DisplayAlert("Error", "Login details missing!", "OK"); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }
可行解决办法
1. 调整SetCurrentActivityResolver调用时机
将CrossFingerprint.SetCurrentActivityResolver的调用移到base.OnCreate之前,确保MAUI初始化前就完成Activity解析器的设置:
protected override void OnCreate(Bundle savedInstanceState) { CrossFingerprint.SetCurrentActivityResolver(() => this); base.OnCreate(savedInstanceState); }
2. 依赖注入获取当前Activity
利用MAUI的依赖注入机制获取当前Activity,避免硬编码绑定:
- 在
MauiProgram.cs中注册Activity服务:
builder.Services.AddSingleton(provider => Platform.CurrentActivity as MainActivity);
- 在调用指纹识别的类中注入
MainActivity,并初始化解析器:
private readonly MainActivity _mainActivity; public YourClass(MainActivity mainActivity) { _mainActivity = mainActivity; CrossFingerprint.SetCurrentActivityResolver(() => _mainActivity); }
3. 强制在主线程执行指纹操作
指纹识别相关API必须在主线程调用,修改biometric方法包裹主线程调用逻辑:
public async Task biometric() { await MainThread.InvokeOnMainThreadAsync(async () => { try { var availability = await CrossFingerprint.Current.IsAvailableAsync(); if (!availability) { await DisplayAlert("警告!", "无可用生物识别功能", "确定"); return; } var authResult = await CrossFingerprint.Current.AuthenticateAsync( new AuthenticationRequestConfiguration( "登录dummy", "解锁设备以使用dummy.")); if (authResult.Authenticated) { if (!string.IsNullOrEmpty(usrname) && !string.IsNullOrEmpty(pasword)) { AutoLogin(usrname, pasword); } else { await DisplayAlert("错误", "登录信息缺失!", "确定"); } } } catch (Exception ex) { Console.WriteLine(ex.Message); } }); }
4. 更新插件到最新版本
旧版Plugin.Fingerprint可能存在MAUI兼容性问题,通过NuGet将插件更新至最新稳定版,确保适配MAUI的Activity生命周期逻辑。
内容的提问来源于stack exchange,提问作者GainzNCode
相关产品推荐
相关产品推荐

