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

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,避免硬编码绑定:

  1. 在MauiProgram.cs中注册Activity服务:
builder.Services.AddSingleton(provider => Platform.CurrentActivity as MainActivity);
  1. 在调用指纹识别的类中注入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:05:10