如何使用 BiometricManager 或 BiometricPrompt 检查生物识别硬件是否可用?
How to check biometric hardware is available using BiometricManager or BiometricPrompt?
我正在使用 BiometricPrompt class 实施生物识别身份验证。
- 如何在调用
BiometricPrompt#authenticate
方法之前检查硬件是否可用?
- 如何查看是否已注册生物识别?
如何调用BiometricManager#canAuthenticate
方法?
我无法在 kotlin
中为 BiometricManager class 创建对象
我当前的实现如下。
val executor = Executors.newSingleThreadExecutor()
val biometricPrompt = BiometricPrompt(this, executor, object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
Log.d("BIOMETRIC", "$errString $errorCode")
if (BiometricPrompt.ERROR_HW_NOT_PRESENT == errorCode || BiometricPrompt.ERROR_NO_BIOMETRICS == errorCode)
PreferenceHandler.setBiometricAvailable(this@LockActivity, false)
else
PreferenceHandler.setBiometricAvailable(this@LockActivity, true)
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
Log.d("BIOMETRIC", "FAILED")
}
})
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("App title")
.setSubtitle("")
.setDescription("Identify yourself by Biometrics")
.setNegativeButtonText("Use Password")
.build()
biometricPrompt.authenticate(promptInfo)
问题终于解决了
BiometricManager
class 在 androidx 库中遗漏了
androidx.biometric:biometric:1.0.0-alpha04
将库版本更新为
androidx.biometric:biometric:1.0.0-beta01
现在您可以导入 androidx.biometric.BiometricManager
您可以检查生物识别硬件的可用性,并通过以下代码注册生物识别:
object BiometricUtil {
fun isHardwareAvailable(context: Context): Boolean{
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
val bm = BiometricManager.from(context)
val canAuthenticate = bm.canAuthenticate()
!(canAuthenticate == BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE || canAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE)
} else {
false
}
}
fun hasBiometricEnrolled(context: Context): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
val bm = BiometricManager.from(context)
val canAuthenticate = bm.canAuthenticate()
(canAuthenticate == BiometricManager.BIOMETRIC_SUCCESS)
} else {
false
}
}
}
我正在使用 BiometricPrompt class 实施生物识别身份验证。
- 如何在调用
BiometricPrompt#authenticate
方法之前检查硬件是否可用? - 如何查看是否已注册生物识别?
如何调用BiometricManager#canAuthenticate
方法?
我无法在 kotlin
我当前的实现如下。
val executor = Executors.newSingleThreadExecutor()
val biometricPrompt = BiometricPrompt(this, executor, object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
Log.d("BIOMETRIC", "$errString $errorCode")
if (BiometricPrompt.ERROR_HW_NOT_PRESENT == errorCode || BiometricPrompt.ERROR_NO_BIOMETRICS == errorCode)
PreferenceHandler.setBiometricAvailable(this@LockActivity, false)
else
PreferenceHandler.setBiometricAvailable(this@LockActivity, true)
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
Log.d("BIOMETRIC", "FAILED")
}
})
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("App title")
.setSubtitle("")
.setDescription("Identify yourself by Biometrics")
.setNegativeButtonText("Use Password")
.build()
biometricPrompt.authenticate(promptInfo)
问题终于解决了
BiometricManager
class 在 androidx 库中遗漏了
androidx.biometric:biometric:1.0.0-alpha04
将库版本更新为
androidx.biometric:biometric:1.0.0-beta01
现在您可以导入 androidx.biometric.BiometricManager
您可以检查生物识别硬件的可用性,并通过以下代码注册生物识别:
object BiometricUtil {
fun isHardwareAvailable(context: Context): Boolean{
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
val bm = BiometricManager.from(context)
val canAuthenticate = bm.canAuthenticate()
!(canAuthenticate == BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE || canAuthenticate == BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE)
} else {
false
}
}
fun hasBiometricEnrolled(context: Context): Boolean {
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
val bm = BiometricManager.from(context)
val canAuthenticate = bm.canAuthenticate()
(canAuthenticate == BiometricManager.BIOMETRIC_SUCCESS)
} else {
false
}
}
}