如何查看 API 级别 28+ 支持哪些生物识别技术?

How to check what biometrics are supported on API level 28+?

我想查看 Android 级别为 API 28+ 的设备支持哪些生物识别技术,以便能够向用户显示相关文本。例如。 "Log in with Fingerprint"、"Login with Face"、"Login with Iris"、"Enable Fingerprint login"、"Enable Face login" 等

我正在使用 BiometricManager.canAuthenticate() 来确定是否可以使用生物识别技术。对于早于 28 的版本 BiometricManager 在内部使用 FingerprintManagerCompat 所以我知道如果结果是 BIOMETRIC_SUCCESS 设备使用指纹。

有没有办法知道支持哪些生物识别技术 - 指纹、面部、虹膜?也许某些设备可以支持多个。

BiometricManager API 似乎被设计成调用应用程序必须不知道所使用的身份验证方法。因此,只要用户成功进行身份验证,就不会产生任何影响(随之而来的是对供应商方面的强身份验证的要求 https://source.android.com/security/biometric)。

因此,不好的事情是:您不能拥有与身份验证方法相匹配的标题,因此您应该想出一些通用的东西,例如“请授权操作”。好消息是,对话提示已经根据支持的身份验证方法呈现(例如,对于指纹身份验证,UI 在匹配图标旁边显示文本 "Touch the fingerprint sensor")。这是由平台完成的,不能由调用应用程序控制。

部分解决方案:您可以使用(现已弃用)API https://developer.android.com/reference/android/hardware/fingerprint/FingerprintManager

具体检查指纹认证的可用性

只有具有 API29 的设备提供比指纹更多的生物识别选项。

通过查看 android.hardware.biometrics.BiometricManager.hasBiometrics() (API29),您可以了解如何检查可用的生物特征:

final PackageManager pm = context.getPackageManager();
        return pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
                || pm.hasSystemFeature(PackageManager.FEATURE_IRIS)
                || pm.hasSystemFeature(PackageManager.FEATURE_FACE);

似乎无法找出在 Android 上使用的实际生物识别方法(与 iOS 不同)。但是可以在 Android 10:

上检测支持的生物识别方法
PackageManager pm = context.getPackageManager();
boolean hasFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
boolean hasFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE);
boolean hasIris = pm.hasSystemFeature(PackageManager.FEATURE_IRIS);

因此,如果 phone 仅支持面部功能,您可以在 GUI 中使用 "Login with Face"。如果它只支持指纹功能,你可以使用 "Login with Fingerprint",等等

如果它支持多种生物识别方法,您将不得不使用一些通用文本,例如 "Biometric login"。

The official recommendation is that you use the AndroidX Biometric Library。它带有一个标准 UI 可以为您处理外形因素。本质上,它检测设备是否具有指纹或面部身份验证外形并进行处理:作为开发人员,您不需要创建生物识别身份验证 UI。要检查设备是否完全支持生物识别,您可以这样做

override fun onClick(view: View) {  // user clicks to authenticate
   val promptInfo = createPromptInfo()
   if (BiometricManager.from(context)
               .canAuthenticate() == BiometricManager.BIOMETRIC_SUCCESS) {
       biometricPrompt.authenticate(promptInfo, cryptoObject)
   } else {
       loginWithAppAccountPassword()
   }
}

您应该使用生物识别支持库的原因:

  • 开发人员不再需要在他们的代码中预测不同的 API 级别,因为该库在幕后处理所有 API 匹配。例如,支持库在 API 级别 23 到 27 上无缝使用 FingerprintManager,在 API 级别 28 及更高级别上无缝使用 BiometricPrompt。
  • 开发人员不再需要创建自己的身份验证UI。该库提供了一种标准且熟悉的 UI,可匹配用户的生物识别身份验证外形,例如指纹或面部身份验证。
  • 开发人员可以通过单个方法调用来检查设备是否支持生物识别身份验证。

使用 PackageManager 可以检查支持哪些生物识别技术。 Here 是一篇提出如何处理显示用户可以理解的字符串的文章。