关于指纹识别的文章可能会有很多,而且很老的咯。
因为这个东西google做得并不好,也因为安卓的生态导致的。
以前的实现方式从6.0开始支持,使用FingerprintManager来实现
注意:Biometric 库扩展了已弃用的 FingerprintManager
API 的功能。
现在已经弃用了。
最新的实现方式是怎么实现的呢?
使用 Biometric 库
这个就是Androidx下的biometric库了。
-
BiometricManager.Authenticators 接口
认证类型,定义了三种认证类型
- BIOMETRIC_STRONG 等级最强的认证,等级3,瞳孔、指纹、脸部识别。可以用于支付、账号登录这些安全要求比较高的。
- BIOMETRIC_WEAK 等级弱的认证,等级2,瞳孔、指纹、脸部识别。意思一下就行的,可以用于一些应用页面的解锁之类的。
- DEVICE_CREDENTIAL 这种是pin码,或者密码解锁,不支持生物特征认证。
-
BiometricManager 这个类可以提供系统里的,Android10使用这个类,如果是Android9.0以前的版本,可以使用FingerprintManagerCompat这个类。可以用于判断支持什么类型的认认证方式。认证方式前面已经说了。
-
BiometricPrompt 在Android10以上的设备,会使用系统所支持的一种认证方式进行认证,比如说瞳孔,脸部识别,指纹。在Android9.0以前的版本,则会弹出一个认证对话框。
-
BiometricPrompt.AuthenticationCallback 认证的回调方法。
- onAuthenticationError 认证错误,比如说不支持认证之类的
- onAuthenticationFailed认证失败
- onAuthenticationSucceeded 认证成功
-
BiometricPrompt.AuthenticationResult 认证结果,这个会在认证成功onAuthenticationSucceeded 的回调方法里传过来。可获取到认证类型以及CryptoObject
-
BiometricPrompt.CryptoObject 包含了签名、Mac、身份之类的相关信息
-
BiometricPrompt.PromptInfo 设置BiometricPrompt如何显示的,后面的快速案例里,我们设置了标题、子标题、以及底部信息之类的。
主要的应用场景
在支付方面的话,微信,支付宝使用的都是自己的协议。所以支付方面的验证,指纹/刷脸这些验证不用我们做。我们顶多就做个私密页面的一个身份校验。或者做已经存在的帐户做一个身份验证。
快速案例
你得有一台支持指纹识别的手机,模拟器也行的。
不管是模拟器, 还是支持指纹识别的手机,先注册指纹。
至于如何检测是否支持指纹验证,稍后再说。
添加依赖
dependencies {
implementation 'androidx.biometric:biometric:1.0.1'
}
测试代码
val executor = ContextCompat.getMainExecutor(this)
val biometricPrompt = BiometricPrompt(this, executor,
object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(errorCode: Int,
errString: CharSequence) {
println("认证错误. errorCode == > $errorCode errString == > $errString")
}
override fun onAuthenticationSucceeded(
result: BiometricPrompt.AuthenticationResult) {
println("认证成功.")
}
override fun onAuthenticationFailed() {
println("认证失败.")
}
})
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("支付验证")//大标题
.setSubtitle("验证指纹密码")//二级标题
.setNegativeButtonText("请使用指纹进行支付")//底部提示
.build()
biometric_login.setOnClickListener {
biometricPrompt.authenticate(promptInfo)
}
如何判断设备支持什么类型的认证?
前面我们说到了,BiometricManager 这个类可以检查设备支持的验证类型,但是API跟官方文档的略微有点区别,这个没关系的,看看里面的代码和方法名字就知道,总离不开Authenticate的。
fun checkAuthenticatorsTypeSupport() {
val biometricManager = BiometricManager.from(this)
val canAuthenticate = biometricManager.canAuthenticate()
when (canAuthenticate) {
BiometricManager.BIOMETRIC_SUCCESS -> {
//a biometric can currently be used 可以使用生物体征验证,包括已经添加了登记
println("BIOMETRIC_SUCCESS")
}
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
//the user does not have any enrolled,用户没有添加任何登记
println("BIOMETRIC_ERROR_NONE_ENROLLED")
}
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> {
//none are currently enabled/supported 不支持
println("BIOMETRIC_ERROR_NO_HARDWARE")
}
}
}
测试:
-
有登记指纹,测试结果:
I/System.out: BIOMETRIC_SUCCESS
-
把登记的指纹删除,测试结果:
删除了,测试一下结果是:
I/System.out: BIOMETRIC_ERROR_NONE_ENROLLED
-
使用不支持的设备进行测试
I/System.out: BIOMETRIC_ERROR_NO_HARDWARE
跳转到收款/付款页面
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val checkAuthenticatorsTypeSupport = checkAuthenticatorsTypeSupport()
if (!checkAuthenticatorsTypeSupport) {
Toast.makeText(this, "不支持指纹验证功能.", Toast.LENGTH_SHORT).show()
} else {
val executor = ContextCompat.getMainExecutor(this)
val biometricPrompt = BiometricPrompt(this, executor,
object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationError(
errorCode: Int,
errString: CharSequence
) {
println("认证错误. errorCode == > $errorCode errString == > $errString")
}
override fun onAuthenticationSucceeded(
result: BiometricPrompt.AuthenticationResult
) {
println("认证成功.")
startActivity(Intent(this@MainActivity, PayActivity::class.java))
}
override fun onAuthenticationFailed() {
println("认证失败.")
}
})
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("支付验证")//大标题
.setSubtitle("验证指纹密码")//二级标题
.setNegativeButtonText("请使用指纹进行支付")//底部提示
.build()
biometric_login.setOnClickListener {
biometricPrompt.authenticate(promptInfo)
}
}
}
private fun checkAuthenticatorsTypeSupport(): Boolean {
val biometricManager = BiometricManager.from(this)
return when (biometricManager.canAuthenticate()) {
BiometricManager.BIOMETRIC_SUCCESS -> {
//a biometric can currently be used
// 可以使用生物体征验证,包括已经添加了登记
println("BIOMETRIC_SUCCESS")
true
}
BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED -> {
//the user does not have any enrolled,
// 用户没有添加任何登记
println("BIOMETRIC_ERROR_NONE_ENROLLED")
false
}
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> {
//none are currently enabled/supported
// 不支持
println("BIOMETRIC_ERROR_NO_HARDWARE")
false
}
else -> false
}
}
}
就这
官方文章地址
详情请看官方吧,适配就像一坨狗屎一样。Android29、Android23、Android24各种玩意
课程不录了,这玩意兼容性难搞。机器也没有,大家遇到问题再发帖子吧。