In Android BiometricPrompt 提示符取代了已弃用的 FingerprintManager。FingerPrintManager具有hasEnrolledFingerprints()
和isHardwareDetected()
两个功能,用于检查设备是否支持指纹以及用户是否已注册任何指纹身份验证。
使用新的生物识别提示,似乎没有功能可以在不尝试提示生物识别提示的情况下检查这一点。调用BiometricPrompt.AuthenticationCallback.onAuthenticationError(
时会显示错误代码,指示设备是否支持生物识别以及用户是否已注册生物识别身份验证。
因此,只有尝试从用户进行身份验证,我才能获取此信息。有没有办法在不尝试提示身份验证的情况下进行检查,以检查设备是否支持生物识别并且用户是否已注册它们?
AndroidX 生物识别 beta01 已添加BiometricManager.canAuthenticate(int)
(以前为 BiometricManager.canAuthenticate()
(
在应用模块的 build.gradle 文件中使用以下依赖项行。
implementation 'androidx.biometric:biometric:1.1.0'
然后,您可以执行以下操作来检查是否有任何生物识别技术可供在设备上使用。
BiometricManager.from(context).canAuthenticate(int) == BiometricManager.BIOMETRIC_SUCCESS
在 Android 6 到 9 上,这仅支持指纹。在 10 及以上,它将支持任何生物识别(例如面部、虹膜(。
如果您使用的是 compileSdkVersion 29 和 buildToolsVersion "29.0.1"。您可以使用本机检查方法。
我为 Kotlin 编写了这个函数:
fun checkForBiometrics() : Boolean {
Log.d(TAG, "checkForBiometrics started")
var canAuthenticate = true
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (Build.VERSION.SDK_INT < 29) {
val keyguardManager : KeyguardManager = applicationContext.getSystemService(KEYGUARD_SERVICE) as KeyguardManager
val packageManager : PackageManager = applicationContext.packageManager
if(!packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
Log.w(TAG, "checkForBiometrics, Fingerprint Sensor not supported")
canAuthenticate = false
}
if (!keyguardManager.isKeyguardSecure) {
Log.w(TAG, "checkForBiometrics, Lock screen security not enabled in Settings")
canAuthenticate = false
}
} else {
val biometricManager : BiometricManager = this.getSystemService(BiometricManager::class.java)
if(biometricManager.canAuthenticate() != BiometricManager.BIOMETRIC_SUCCESS){
Log.w(TAG, "checkForBiometrics, biometrics not supported")
canAuthenticate = false
}
}
}else{
canAuthenticate = false
}
Log.d(TAG, "checkForBiometrics ended, canAuthenticate=$canAuthenticate ")
return canAuthenticate
}
此外,您必须在应用程序 gradle 文件上实现为依赖项:
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
还可以使用最新的构建工具:
compileSdkVersion 29
buildToolsVersion "29.0.1"
FingerPrintManager
仅具有有关指纹身份验证的数据,因此它具有hasEnrolledFringers()
。但BiometricPrompt
用于面部解锁,精细打印,虹膜。这就像一个普通的经理类。谷歌增加了canAuthenticate
,支持Android Q。但是您可以使用以下方法检查它是否有较低的API
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
val hasBiometricFeature :Boolean = context.packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)
无论如何,谷歌也已将其添加到androidx组件中androidx.biometric:biometric
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
使用权限
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
在"身份验证回调"上
public void onAuthenticationError(int errorCode, CharSequence errString) {}
您可以使用那些检查错误代码
/**
* The user does not have any biometrics enrolled.
*/
int BIOMETRIC_ERROR_NO_BIOMETRICS = 11;
/**
* Check For Biometrics Support
* --> Fingerprint don't support in this device
* --> Fingerprint not enable in this device
*/
fun checkForBiometricsSupport(context: Context): Boolean {
val status = BiometricManager.from(context).canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)
return status == BiometricManager.BIOMETRIC_SUCCESS
}
使用BiometricManager
它有一个方法
canAuthenticate()
它返回
BIOMETRIC_ERROR_NONE_ENROLLED if the user does not have any enrolled
BIOMETRIC_ERROR_HW_UNAVAILABLE if none are currently supported/enabled
BIOMETRIC_SUCCESS if a biometric can currently be used (enrolled and available)
BIOMETRIC_ERROR_NO_HARDWARE
查看官方文档 https://developer.android.com/reference/android/hardware/biometrics/BiometricManager.html
以下是截至今天在 Kotlin 中使用生物识别身份验证的最新实现:
第 1 步:在 build.gradle 中添加以下依赖项
implementation "androidx.biometric:biometric:1.1.0"
第 2 步:在 Android 清单中添加以下权限.xml
<uses-permission android:name="android.permission.USE_BIOMETRIC" />
步骤3:添加以下方法以检查是否启用了生物识别:
/**
* To check if the devices supports biometric authentication
*/
fun isBioMetricEnabled(ctx: Context) : Boolean {
val biometricManager = BiometricManager.from(ctx)
return biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK) ==
BiometricManager.BIOMETRIC_SUCCESS
}
有关完整的生物识别身份验证实施,请参阅:
Android BiometricPrompt.Builder.authenticate(( 未显示任何对话框