Android生物识别API问题



我想要实现的:提供不同的生物识别登录选项,如指纹,面部识别和虹膜。我想提供使用PIN,密码或模式的选项,以防任何生物识别传感器不起作用。

问题:当用户点击">使用密码";选项,则直接转到">onAuthenticationError";回调,我正在检查错误代码BiometricPrompt。ERROR_NEGATIVE_BUTTON. 我担心的是,我需要自己处理吗?我的意思是我需要显示一个对话框弹出,我会问用户输入他/她的电子邮件/用户名和密码,然后他/她可以登录在我的应用程序?

我做了什么:

依赖:

implementation 'androidx.biometric:biometric:1.2.0-alpha01'

MainActivity.kt

class MainActivity : AppCompatActivity() {
private lateinit var executor: Executor
private lateinit var biometricPrompt: BiometricPrompt
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
executor = ContextCompat.getMainExecutor(this)
biometricPrompt = createBiometricObject()
}
private fun createBiometricObject(): BiometricPrompt {
return BiometricPrompt(this, executor, object : AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
super.onAuthenticationError(errorCode, errString)
if (errorCode == ERROR_NEGATIVE_BUTTON && errString == "Use Password") {
// Do I need to create my own DialogPopUp?
}
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
super.onAuthenticationSucceeded(result)
}
})
}
fun loginWithBiometrics(view: View) {
when (BiometricManager.from(this).canAuthenticate(BIOMETRIC_STRONG)) {
BiometricManager.BIOMETRIC_SUCCESS -> biometricPrompt.authenticate(
createPromptInfoForBiometrics()
)
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> Toast.makeText(
this,
"Please enroll your biometrics",
Toast.LENGTH_LONG
).show()
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> Toast.makeText(
this,
"Device not compatible",
Toast.LENGTH_LONG
).show()
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> Toast.makeText(
this,
"Sensors are available as off now, please try again later!",
Toast.LENGTH_LONG
).show()
BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED -> {
TODO()
}
BiometricManager.BIOMETRIC_ERROR_UNSUPPORTED -> {
TODO()
}
BiometricManager.BIOMETRIC_STATUS_UNKNOWN -> {
biometricPrompt.authenticate(createPromptInfoForBiometrics())
}
}
}
private fun createPromptInfoForBiometrics(): BiometricPrompt.PromptInfo {
return BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometric Login")
.setSubtitle("Please login with your biometrics")
.setNegativeButtonText("Use Password")
.setAllowedAuthenticators(BIOMETRIC_STRONG)
.build()
}
}

如有任何帮助,不胜感激。

您应该尝试将DEVICE_CREDENTIAL标志传递给setAllowedAuthenticators()

BiometricPrompt.PromptInfo.Builder()
.setTitle("Biometric login for my app")
//..
.setAllowedAuthenticators(DEVICE_CREDENTIAL or BIOMETRIC_STRONG)
.build()

但也要确保你使用适当的android API级别。根据文档:

请注意,并不是所有验证器类型的组合都受支持在Android 11 (API 30)之前。具体来说,DEVICE_CREDENTIAL单独为API 30之前不支持,和BIOMETRIC_STRONG | DEVICE_CREDENTIAL在API 28-29上不支持。设置不支持的值当调用build()时,受影响的Android版本将导致错误。

最新更新