android:name="android.permission.USE_FINGERPRINT"/>
FingerprintManagerCompat fingerprint = FingerprintManagerCompat.from(this);
fingerprint.isHardwareDetected();
这里返回的一个boolean值,true:支持 false:不支持
fingerprint.hasEnrolledFingerprints();
同样这里返回的也是一个boolean值, true:保存过 false:没保存过
fingerprint.authenticate(crypto, flags,cancel,callback,handler)
crypto:可以传null,想要了解的话,可以自行去查看源码
flags:传0
cancel:new cancellationsignal();
callback:是验证结果和验证状态的回调 ↓ 贴上代码,注释很详细,就不解释了;
callback = new FingerprintManagerCompat.AuthenticationCallback() { @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { super.onAuthenticationError(errMsgId, errString); //验证错误时,回调该方法。当连续验证5次错误时,将会走onAuthenticationFailed()方法 hander.obtainMessage(1, errMsgId, 0).sendToTarget(); } @Override public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) { super.onAuthenticationSucceeded(result); //验证成功时,回调该方法。fingerprint对象不能再验证 hander.obtainMessage(2).sendToTarget(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); //验证失败时,回调该方法。fingerprint对象不能再验证并且需要等待一段时间才能重新创建指纹管理对象进行验证 hander.obtainMessage(3).sendToTarget(); } };
handler:根据回调返回的状态,做出相应的UI更新 ↓ 贴上代码,我这里成功的话直接跳到详情界面
msg.what返回“1”的话,还会有很多种状态,下面会介绍
hander = new Handler(getMainLooper()) { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: //验证错误 //todo 界面处理 handleErrorCode(msg.arg1); Log.e(tag, "验证错误"); break; case 2: //验证成功 //todo 界面处理 Log.e(tag, "验证成功"); Toast.makeText(MainActivity.this, "验证成功", Toast.LENGTH_SHORT).show(); startActivity(new Intent(MainActivity.this, Bactivity.class)); break; case 3: //验证失败 //todo 界面处理 Log.e(tag, "验证失败"); Toast.makeText(MainActivity.this, "验证失败···", Toast.LENGTH_SHORT).show(); break; } } };
验证错误: 一切理想状态下(前置条件都通过的话)开始验证指纹,但是不是移动设备本身保存过的指纹。
验证失败:一切理想状态下(前置条件都通过的话)开始验证指纹,每次都不是移动设备本身保存过的指纹,并且次数比较多msg.what才会返回“3”; 小米默认为5次,vivo默认5次。其他机型有兴趣可以自行测试
private void handleErrorCode(int code) { switch (code) { case FingerprintManager.FINGERPRINT_ERROR_CANCELED: //todo 指纹传感器不可用,该操作被取消 Toast.makeText(this, "验证错误···", Toast.LENGTH_SHORT).show(); break; case FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE: //todo 当前设备不可用,请稍后再试 Toast.makeText(this, "验证错误···", Toast.LENGTH_SHORT).show(); break; case FingerprintManager.FINGERPRINT_ERROR_LOCKOUT: //todo 由于太多次尝试失败导致被锁,该操作被取消 Toast.makeText(this, "由于太多次尝试失败导致被锁,该操作被取消···", Toast.LENGTH_SHORT).show(); break; case FingerprintManager.FINGERPRINT_ERROR_NO_SPACE: //todo 没有足够的存储空间保存这次操作,该操作不能完成 Toast.makeText(this, "没有足够的存储空间保存这次操作,该操作不能完成···", Toast.LENGTH_SHORT).show(); break; case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT: //todo 操作时间太长,一般为30秒 Toast.makeText(this, "验证错误···", Toast.LENGTH_SHORT).show(); break; case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS: //todo 传感器不能处理当前指纹图片 Toast.makeText(this, "验证错误···", Toast.LENGTH_SHORT).show(); break; } }
然后最后贴上源码希望对大家有所帮助 点击打开链接