背景
MAUI的出现,赋予了广大.Net开发者开发多平台应用的能力,MAUI 是Xamarin.Forms演变而来,但是相比Xamarin性能更好,可扩展性更强,结构更简单。但是MAUI对于平台相关的实现并不完整。所以MASA团队开展了一个实验性项目,意在对微软MAUI的补充和扩展,
项目地址https://github.com/BlazorComponent/MASA.Blazor/tree/main/src/Masa.Blazor.Maui.Plugin
每个功能都有单独的demo演示项目,考虑到app安装文件体积(虽然MAUI已经集成裁剪功能,但是该功能对于代码本身有影响),届时每一个功能都会以单独的nuget包的形式提供,方便测试,现在项目才刚刚开始,但是相信很快就会有可以交付的内容啦。
前言
本系列文章面向移动开发小白,从零开始进行平台相关功能开发,演示如何参考平台的官方文档使用MAUI技术来开发相应功能。
介绍
在 API 级别 23 (Android 6.0) 设备上引入指纹扫描仪为应用程序提供了传统的用户名/密码用户身份验证的替代方法。 相较于用户名和密码,采用指纹对用户进行身份验证使应用程序安全性的实现更具隐私性,之后 API-28(Android9.0) 中添加了生物识别身份验证Biometric,增加了人脸认证相关功能。我们今天讨论的只涉及指纹认证,考虑到兼容性问题采用API - 23 (Android 6.0) 版本提供的 FingerprintManager API,经过测试可以在Android 6.0 -11.0中正常工作,如果您需要人脸验证相关功能请参考链接: androidx.biometric,实现细节与本文类似。
思路
我们先看一下Android 的指纹验证方法核心的指纹管理类FingerprintManagerCompat ,fingerprintManager是通过FingerprintManagerCompat.from(Context context)来创建的。
JAVA代码
FingerprintManagerCompat fingerprintManager= FingerprintManagerCompat.from(Context context);
1、检查资格:
1、需要检查设备是否支持指纹。
2、需要检查设备是否受保护 - 用户必须使用屏幕锁保护设备。 如果用户未使用屏幕锁保护设备,但是当前应用程序对于安全性要求很高,则应通知用户必须配置屏幕锁。
3、需要检查用户是否已经注册指纹 - 用户必须至少有一个指纹已注册到操作系统。 此权限检查应在每次尝试进行身份验证之前进行,因为用户有可能随时取消指纹
在MAUI blazor项目的Platforms->Android文件夹添加MasaMauiFingerprintService.cs 类,添加如下两个方法
public static class MasaMauiFingerprintService
{
private static FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.From(Android.App.Application.Context);
/// <summary>
/// Check eligibility
/// </summary>
/// <returns>error message</returns>
public static async Task<string> CheckingEligibility()
{
// 1、Check if your hardware supports it
if (!fingerprintManager.IsHardwareDetected)
{
return "IsHardwareDetected";
}
// 2、Check if the user is using a screen lock
// KeyguardManager: Lock screen management class
var keyguardManager = Android.App.Application.Context.GetSystemService(Context.KeyguardService) as KeyguardManager;
if (!keyguardManager.IsKeyguardSecure)
{
return "The device does not have a screen lock set";
}
// 3、Check if at least one fingerprint is registered
if (!fingerprintManager.HasEnrolledFingerprints)
{
return "The device does not have a fingerprint set, please set at least one fingerprint";
}
var granted = await CheckAndRequestFingerprintPermission();
if (!granted)
{
return "Permissions not granted";
}
return string.Empty;
}
/// <summary>
/// Permission check
/// </summary>
/// <returns></returns>
private static async Task<bool> CheckAndRequestFingerprintPermission()
{
var status = await Permissions.CheckStatusAsync<AndroidFingerprintPermissions>(