从API 29 即 Android 10 开始,系统为第三方应用提供了通过生物识别验证用户是否为本人的功能,实现也比较简单
因为在进行生物识别时,系统会禁止本应用截图,录屏也会是黑屏,所以借用官方文档中的图
首先要使用生物识别需要判断系统版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
//使用生物识别
}else{
//不使用生物识别
}
声明权限
<uses-permission android:name="android.permission.USE_BIOMETRIC"/>
创建对象
整个流程基本涉及三个对象
BiometricPrompt为生物识别的对话框,通过Builder的build()方法创建,通过authenticate方法显示
CancellationSignal为主动取消生物识别的标识,在需要主动取消生物识别(关闭对话框)的时候,需要调用CancellationSignal的cancel()方法。重复显示对话框时不能复用同一个CancellationSignal,否则会抛出异常
AuthenticationCallback是验证结果的回调,包括验证成功、失败、取消等
//创建一个生物识别的对话框,
biometricPrompt=BiometricPrompt.Builder(this)
.setTitle("生物识别标题")
.setDescription("描述")
.setNegativeButton("取消",mainExecutor, object : DialogInterface.OnClickListener {
override fun onClick(dialog: DialogInterface?, which: Int) {
Toast.makeText(this@MainActivity, "取消", Toast.LENGTH_SHORT).show()
}
})
.build()
//实现AuthenticationCallback,在身份验证通过、失败、取消时,会调用相应的方法
authenticationCallback=object : BiometricPrompt.AuthenticationCallback(){
override fun onAuthenticationError(errorCode: Int, errString: CharSequence?) {
super.onAuthenticationError(errorCode, errString)
Log.i(TAG, "onAuthenticationError: ${errString}")
}
override fun onAuthenticationHelp(helpCode: Int, helpString: CharSequence?) {
super.onAuthenticationHelp(helpCode, helpString)
Log.i(TAG, "onAuthenticationHelp: ${helpString}")
}
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult?) {
super.onAuthenticationSucceeded(result)
Log.i(TAG, "onAuthenticationSucceeded: ")
}
override fun onAuthenticationFailed() {
super.onAuthenticationFailed()
Log.i(TAG, "onAuthenticationFailed: ")
}
}
开始验证
//每次调用authenticate时都必须传入一个新的CancellationSignal对象,否则会抛出异常
cancellationSignal= CancellationSignal()
cancellationSignal.setOnCancelListener {
//主动取消后的逻辑,调用cancellationSignal.cancel()时会走这里
}
biometricPrompt.authenticate(cancellationSignal,mainExecutor,authenticationCallback)