引言
众所周知android sdk在6.0引入了指纹识别管理类FingerprintManager
,目前市场主流手机几乎都已经添加了指纹识别的功能,所以新版App应用中,大家都会开始逐步添加关于指纹识别的功能。
指纹识别的功能,目前在App应用中,主要是作为用户身份的快速识别而体现的,如支付宝的支付确认,各大银行App的快速登录认证,系统开机解锁屏幕等等,所以就研究了下,抽了个工具类方便使用。
效果图
无
使用方法
由于指纹识别功能还是需要申请权限的,所以切不可忘记在你的AndroidManifest.xml
文件中加入android.permission.USE_FINGERPRINT
相关权限。
<uses-permission android:name="android.permission.USE_FINGERPRINT" />
其中指纹识别管理类我选择使用官方support.v4包里提供的FingerprintManagerCompat
类,该类已经帮忙做了兼容性处理,所以提取工具类的时候更方便快捷一些,代码的封装逻辑上,把大部分error,help,failed反馈信息过滤,只保留最基础的成功与连续多次认证错误所导致的短时间内无法重复申请认证的错误提示,其中当code返回为7的时候,说明短时间内无法再次验证
/**
* The operation was canceled because the API is locked out due to too many attempts.
*/
public static final int FINGERPRINT_ERROR_LOCKOUT = 7;
在你的当前页面中,使用如下方法,传入当前上下文参数加上回调就可使用,其中FingerPrintUtils.cancelCallback()
方法是用来关闭监听的回调事件所用,建议在页面退出时,与指纹识别事件结束时调用,success()
方法为识别成功回调,一次启动只会调用一次,error()
方法为短时间内失败次数超过上限,系统会主动暂停指纹识别的功能,retry()
方法是默认允许可重试的回调,当指纹不清晰或者手势移动过快,识别失败次数未超过上限时回调,此处可提示用户再次识别
@BindView(R.id.tv_info)
TextView tvInfo;
@BindString(R.string.finger_print_info)
String strInfo;
/**
* 开始指纹识别扫描
*/
private void startFingerPrint() {
FingerPrintUtils.init(mContext, new FingerPrintUtils.FingerPrintResult() {
@Override
public void success() {
tvInfo.setText(strInfo+"支付成功,关闭指纹识别功能");
FingerPrintUtils.cancelCallback();
}
@Override
public void error(int code, CharSequence info) {
tvInfo.setText(strInfo+"支付失败,关闭指纹识别功能\n"+"code=" + code + ",error info=" + info);
FingerPrintUtils.cancelCallback();
}
@Override
public void retry(int code, CharSequence info) {
tvInfo.setText(strInfo+"支付失败,请重试\n"+"code=" + code + ",retry info=" + info);
}
});
}
源码放出
package com.xxx.yyy;
import android.content.Context;
import android.hardware.fingerprint.FingerprintManager;
import android.support.v4.hardware.fingerprint.FingerprintManagerCompat;
import android.support.v4.os.CancellationSignal;
/**
* Created by gu.yj on 2018/4/16 .
* need <uses-permission android:name="android.permission.USE_FINGERPRINT" />
*/
public class FingerPrintUtils {
private static FingerprintManagerCompat mFingerprintManagerCompat;
private static CancellationSignal mCancellationSignal;
public interface FingerPrintResult {
void success();
void error(int code, CharSequence info);
void retry(int code, CharSequence info);
}
public static boolean cancelCallback(){
if(mCancellationSignal!=null&&!mCancellationSignal.isCanceled()){
mCancellationSignal.cancel();
mCancellationSignal=null;
return true;
}else{
return false;
}
}
public static void init(Context context, final FingerPrintResult fpResult) {
if (context == null || fpResult == null) {
throw new RuntimeException("FingerPrintUtils.init()参数Context或者FingerPrintResult为null");
}
if (mFingerprintManagerCompat == null || mCancellationSignal == null) {
mFingerprintManagerCompat = FingerprintManagerCompat.from(context);
mCancellationSignal = new CancellationSignal();
}
if (mFingerprintManagerCompat.isHardwareDetected() && mFingerprintManagerCompat.hasEnrolledFingerprints()) {
mFingerprintManagerCompat.authenticate(null, 0, mCancellationSignal, new FingerprintManagerCompat.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errorCode, CharSequence errString) {
super.onAuthenticationError(errorCode, errString);
if (errorCode == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {
fpResult.error(FingerprintManager.FINGERPRINT_ERROR_LOCKOUT, errString);
}else {
fpResult.retry(errorCode,errString);
}
}
@Override
public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
super.onAuthenticationHelp(helpCode, helpString);
fpResult.retry(helpCode,helpString);
}
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
fpResult.success();
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
fpResult.retry(0,"authentication failed");
}
}, null);
} else {
fpResult.error(-1, "硬件设备不支持指纹认证");
}
}
}
结束语
小工具类,就没有提交github了,不过也欢迎观光团
https://github.com/kaxi4it
网友评论