Android指纹识别,提升APP用户体验,从这里开始( 三 )

基于Android 6.0 实现指纹识别上文有提及,FingerprintAndrM 是基于 Android 6.0 的具体的指纹识别实现类:
@RequiresApi(api = Build.VERSION_CODES.M)public class FingerprintAndrM implements IFingerprint { private final String TAG = FingerprintAndrM.class.getName(); private Activity context; private static FingerprintAndrM fingerprintAndrM; //指纹验证框 private static FingerprintDialog fingerprintDialog; //指向调用者的指纹回调 private FingerprintCallback fingerprintCallback; //用于取消扫描器的扫描动作 private CancellationSignal cancellationSignal; //指纹加密 private static FingerprintManagerCompat.CryptoObject cryptoObject; //Android 6.0 指纹管理 private FingerprintManagerCompat fingerprintManagerCompat; @Override public void authenticate(Activity context, VerificationDialogStyleBean bean, FingerprintCallback callback) { //判断指纹识别是否可用 if (!canAuthenticate(context, callback)) return; this.context = context; this.fingerprintCallback = callback; //Android 6.0 指纹管理 实例化 fingerprintManagerCompat = FingerprintManagerCompat.from(context); //取消扫描,每次取消后需要重新创建新示例 cancellationSignal = new CancellationSignal(); cancellationSignal.setOnCancelListener(() -> fingerprintDialog.dismiss()); //调起指纹验证 fingerprintManagerCompat.authenticate(cryptoObject, 0, cancellationSignal, authenticationCallback, null); //指纹验证框 fingerprintDialog = FingerprintDialog.newInstance(context).setActionListener(dialogActionListener).setDialogStyle(bean); fingerprintDialog.show(context.getFragmentManager(), TAG); } public static FingerprintAndrM newInstance() { if (fingerprintAndrM == null) { synchronized (FingerprintAndrM.class) { if (fingerprintAndrM == null) { fingerprintAndrM = new FingerprintAndrM(); } } } //指纹加密,提前进行Cipher初始化,防止指纹认证时还没有初始化完成 try { cryptoObject = new FingerprintManagerCompat.CryptoObject(new CipherHelper().createCipher()); } catch (Exception e) { e.printStackTrace(); } return fingerprintAndrM; } /** * 指纹验证框按键监听 */ private FingerprintDialog.OnDialogActionListener dialogActionListener = new FingerprintDialog.OnDialogActionListener() { @Override public void onUsepwd() { if (fingerprintCallback != null) fingerprintCallback.onUsepwd(); } @Override public void onCancle() {//取消指纹验证,通知调用者 if (fingerprintCallback != null) fingerprintCallback.onCancel(); } @Override public void onDismiss() {//验证框消失,取消指纹验证 if (cancellationSignal != null && !cancellationSignal.isCanceled()) cancellationSignal.cancel(); } }; /** * 指纹验证结果回调 */ private FingerprintManagerCompat.AuthenticationCallback authenticationCallback = new FingerprintManagerCompat.AuthenticationCallback() { @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { super.onAuthenticationError(errMsgId, errString); fingerprintDialog.setTip(errString.toString(), R.color.biometricprompt_color_FF5555); } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { super.onAuthenticationHelp(helpMsgId, helpString); fingerprintDialog.setTip(helpString.toString(), R.color.biometricprompt_color_FF5555); } @Override public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) { super.onAuthenticationSucceeded(result); fingerprintDialog.setTip(context.getString(R.string.biometricprompt_verify_success), R.color.biometricprompt_color_82C785); fingerprintCallback.onSucceeded(); fingerprintDialog.dismiss(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); fingerprintDialog.setTip(context.getString(R.string.biometricprompt_verify_failed), R.color.biometricprompt_color_FF5555); fingerprintCallback.onFailed(); } }; /* * 在 Android Q,Google 提供了 Api BiometricManager.canAuthenticate() 用来检测指纹识别硬件是否可用及是否添加指纹 * 不过尚未开放,标记为"Stub"(存根) * 所以暂时还是需要使用 Andorid 6.0 的 Api 进行判断 * */ private boolean canAuthenticate(Context context, FingerprintCallback fingerprintCallback) { /* * 硬件是否支持指纹识别 * */ if (!FingerprintManagerCompat.from(context).isHardwareDetected()) { fingerprintCallback.onError(FingerprintManager.FINGERPRINT_ERROR_HW_NOT_PRESENT, context.getString(R.string.biometricprompt_verify_error_no_hardware)); return false; } //是否已添加指纹 if (!FingerprintManagerCompat.from(context).hasEnrolledFingerprints()) { fingerprintCallback.onNoneEnrolled(); return false; } return true; }}这里面要重点关注 CancellationSignal 与指纹识别框的关联,也就是识别框消失,就一定要取消指纹扫描器的扫描操作,否则在超时时间内,用户将无法再次拉起指纹识别(尽管可以弹出指纹识别框) 。
基于Android 9.0 实现指纹识别上文有提及,FingerprintAndrP 是基于 Android 9.0 的具体的指纹识别实现类:
@RequiresApi(api = Build.VERSION_CODES.P)public class FingerprintAndrP implements IFingerprint { private static FingerprintAndrP fingerprintAndrP; //指向调用者的指纹回调 private FingerprintCallback fingerprintCallback; //用于取消扫描器的扫描动作 private CancellationSignal cancellationSignal; //指纹加密 private static BiometricPrompt.CryptoObject cryptoObject; @Override public void authenticate(Activity context, VerificationDialogStyleBean verificationDialogStyleBean, FingerprintCallback callback) { //判断指纹识别是否可用 if (!canAuthenticate(context, callback)) return; this.fingerprintCallback = callback; /* * 初始化 BiometricPrompt.Builder */ …… //构建 BiometricPrompt BiometricPrompt biometricPrompt = builder.build(); //取消扫描,每次取消后需要重新创建新示例 cancellationSignal = new CancellationSignal(); cancellationSignal.setOnCancelListener(() -> { }); /* * 拉起指纹验证模块,等待验证 * Executor: * context.getMainExecutor() */ biometricPrompt.authenticate(cryptoObject, cancellationSignal, context.getMainExecutor(), authenticationCallback); } public static FingerprintAndrP newInstance() { if (fingerprintAndrP == null) { synchronized (FingerprintAndrM.class) { if (fingerprintAndrP == null) { fingerprintAndrP = new FingerprintAndrP(); } } } //指纹加密,提前进行Cipher初始化,防止指纹认证时还没有初始化完成 try { cryptoObject = new BiometricPrompt.CryptoObject(new CipherHelper().createCipher()); } catch (Exception e) { e.printStackTrace(); } return fingerprintAndrP; } /** * 认证结果回调 */ private BiometricPrompt.AuthenticationCallback authenticationCallback = new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, CharSequence errString) { super.onAuthenticationError(errorCode, errString); if (fingerprintCallback != null) { if (errorCode == 5) {//用户取消指纹验证,不必向用户抛提示信息 fingerprintCallback.onCancel(); return; } fingerprintCallback.onError(errorCode, errString.toString()); } } @Override public void onAuthenticationHelp(int helpCode, CharSequence helpString) { super.onAuthenticationHelp(helpCode, helpString); if (fingerprintCallback != null) fingerprintCallback.onError(helpCode, helpString.toString()); } @Override public void onAuthenticationSucceeded(BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); if (fingerprintCallback != null) fingerprintCallback.onSucceeded(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); if (fingerprintCallback != null) fingerprintCallback.onFailed(); } }; /* * 在 Android Q,Google 提供了 Api BiometricManager.canAuthenticate() 用来检测指纹识别硬件是否可用及是否添加指纹 * 不过尚未开放,标记为"Stub"(存根) * 所以暂时还是需要使用 Andorid 6.0 的 Api 进行判断 * */ private boolean canAuthenticate(Context context, FingerprintCallback fingerprintCallback) { /* * 硬件是否支持指纹识别 * */ if (!FingerprintManagerCompat.from(context).isHardwareDetected()) { fingerprintCallback.onError(FingerprintManager.FINGERPRINT_ERROR_HW_NOT_PRESENT, context.getString(R.string.biometricprompt_verify_error_no_hardware)); return false; } //是否已添加指纹 if (!FingerprintManagerCompat.from(context).hasEnrolledFingerprints()) { fingerprintCallback.onNoneEnrolled(); return false; } return true; }}


推荐阅读