Android 指纹解锁
util类:
public class FingerprintUtil { public static CancellationSignal cancellationSignal; public static void callFingerPrint(Context context, final OnCallBackListener listener){ FingerprintManagerCompat managerCompat = FingerprintManagerCompat.from(context.getApplicationContext()); if (!managerCompat.isHardwareDetected()){ //判断设备是否支持 if (listener != null) listener.onSupportFailed(); return; } KeyguardManager keyguardManager =(KeyguardManager)context.getApplicationContext().getSystemService(Context.KEYGUARD_SERVICE); if (!keyguardManager.isKeyguardSecure()) {//判断设备是否处于安全保护中 if (listener != null) listener.onInsecurity(); return; } if (!managerCompat.hasEnrolledFingerprints()){ //判断设备是否已经注册过指纹 if (listener != null) listener.onEnrollFailed(); //未注册 return; } if (listener != null) listener.onAuthenticationStart(); //开始指纹识别 cancellationSignal = new CancellationSignal(); //必须重新实例化,否则cancel 过一次就不能再使用了 managerCompat.authenticate(null,0,cancellationSignal,new FingerprintManagerCompat.AuthenticationCallback(){ // 当出现错误的时候回调此函数,比如多次尝试都失败了的时候,errString是错误信息,比如华为的提示就是:尝试次数过多,请稍后再试。 @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { if (listener != null) listener.onAuthenticationError(errMsgId ,errString ); } // 当指纹验证失败的时候会回调此函数,失败之后允许多次尝试,失败次数过多会停止响应一段时间然后再停止sensor的工作 @Override public void onAuthenticationFailed() { if (listener != null) listener.onAuthenticationFailed(); } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { if (listener != null) listener.onAuthenticationHelp(helpMsgId,helpString); } // 当验证的指纹成功时会回调此函数,然后不再监听指纹sensor @Override public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) { if (listener != null) listener.onAuthenticationSucceeded(result); } ; },null); } public interface OnCallBackListener{ void onSupportFailed(); void onInsecurity(); void onEnrollFailed(); void onAuthenticationStart(); void onAuthenticationError(int errMsgId, CharSequence errString); void onAuthenticationFailed(); void onAuthenticationHelp(int helpMsgId, CharSequence helpString); void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result); } public static void cancel(){ if (cancellationSignal != null) cancellationSignal.cancel(); } }
使用util类:
public void onFingerprintClick(){ FingerprintUtil.callFingerPrint(getActivity(),new FingerprintUtil.OnCallBackListener() { AlertDialog dialog; @Override public void onSupportFailed() { showToast("当前设备不支持指纹或者Android版本低于6.0"); showDialog(); } @Override public void onInsecurity() { showToast("当前设备未处于安全保护中"); } @Override public void onEnrollFailed() { showToast("请到设置中设置指纹"); } @Override public void onAuthenticationStart() { AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); View view = LayoutInflater.from(getActivity()).inflate(R.layout.layout_fingerprint,null); initView(view); builder.setView(view); builder.setCancelable(false); dialog = builder.create(); dialog.show(); final TextView tvPwd = (TextView) view.findViewById(R.id.tvPwd); tvPwd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { handler.removeMessages(0); FingerprintUtil.cancel(); showDialog(); } }); final TextView tvCancel = (TextView) view.findViewById(R.id.tvCancel); tvCancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { handler.removeMessages(0); FingerprintUtil.cancel(); } }); } @Override public void onAuthenticationError(int errMsgId, CharSequence errString) { showToast(errString.toString()); if (dialog != null &&dialog.isShowing()){ dialog.dismiss(); handler.removeMessages(0); } } @Override public void onAuthenticationFailed() { showToast("解锁失败"); } @Override public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { showToast(helpString.toString()); } @Override public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) { showToast("解锁成功"); if (dialog != null &&dialog.isShowing()){ dialog.dismiss(); handler.removeMessages(0); } if (isSafety){ code = 0; }else { code = 1; } setSafetyInfo(code); } }); }