//1.1.添加使用指纹权限
//2.获取指纹管理对象
//v4包下的API,包装内部已经判断Android系统版本是否大于6.0,这也是官方推荐的方式
FingerprintManagerCompat fingerprint = FingerprintManagerCompat.from(this);
//3.判断设备是否支持 判断设备是否保存过指纹信息
//第一步 判断设备是否支持指纹
boolean ishardwareDetected = fingerprint.isHardwareDetected();
判断设备是否以保存过指纹信息,至少需要保存过一个
boolean hasfingerprint = fingerprint.hasEnrolledFingerprints();
//取消验证使用 CancellationSignal cancel = new CancellationSignal();
cancel.cacel();
//以下是代码
public class FingerprintActivity extends AppCompatActivity {
private CancellationSignal cancel;
Handler handler;
private FingerprintDialog fingerprintDialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fingerprint);
}
//对应不同的错误,可以有不同的操作
private void handleErrorCode(int code) {
switch (code) {
case FingerprintManager.FINGERPRINT_ERROR_CANCELED:
//todo 指纹传感器不可用,该操作被取消
Log.d("指纹测试", "指纹传感器不可用,该操作被取消");
break;
case FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE:
//todo 当前设备不可用,请稍后再试
Log.d("指纹测试", "当前设备不可用,请稍后再试");
break;
case FingerprintManager.FINGERPRINT_ERROR_LOCKOUT:
//todo 由于太多次尝试失败导致被锁,该操作被取消
Log.d("指纹测试", "当前设备不可用,请稍后再试");
break;
case FingerprintManager.FINGERPRINT_ERROR_NO_SPACE:
//todo 没有足够的存储空间保存这次操作,该操作不能完成
Log.d("指纹测试", "没有足够的存储空间保存这次操作,该操作不能完成");
break;
case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT:
//todo 操作时间太长,一般为30秒
Log.d("指纹测试", "操作时间太长,一般为30秒");
break;
case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
//todo 传感器不能处理当前指纹图片
Log.d("指纹测试", "传感器不能处理当前指纹图片");
break;
}
}
public void fingerPrintClick(View view) {
//获取指纹管理器
v4包下的API,包装内部已经判断Android系统版本是否大于6.0,这也是官方推荐的方式
FingerprintManagerCompat fingerprint = FingerprintManagerCompat.from(this);
//FingerprintManager fingerprint2 = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE); //Android 6.0包下的API
FingerprintManager fingerprint2 = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
//第一步 判断设备是否支持指纹
boolean ishardwareDetected = fingerprint.isHardwareDetected();
判断设备是否以保存过指纹信息,至少需要保存过一个
boolean hasfingerprint = fingerprint.hasEnrolledFingerprints();
/**
* @param crypto object associated with the call or null if none required. //不太理解,加密指纹特征还是什么,可以不加密置为null
* @param flags optional flags; should be 0 //设置标记,暂时无用
* @param cancel an object that can be used to cancel authentication //取消验证
* @param callback an object to receive authentication events //系统认证完成之后,回调该接口
* @param handler an optional handler for events //处理callback接口后,界面的处理,默认是主线程handler
*/
cancel = new CancellationSignal();
fingerprint.authenticate(null, 0, cancel, new FingerprintManagerCompat.AuthenticationCallback() {
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
super.onAuthenticationError(errMsgId, errString);
//验证错误时,回调该方法。当连续验证5次错误时,将会走onAuthenticationFailed()方法
handler.obtainMessage(1, errMsgId, 0).sendToTarget();
}
@Override
public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
super.onAuthenticationSucceeded(result);
//验证成功时,回调该方法。fingerprint对象不能再验证
handler.obtainMessage(2).sendToTarget();
}
@Override
public void onAuthenticationFailed() {
super.onAuthenticationFailed();
//验证失败时,回调该方法。fingerprint对象不能再验证并且需要等待一段时间才能重新创建指纹管理对象进行验证
handler.obtainMessage(3).sendToTarget();
}
}, handler = new Handler(getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1: //验证错误
//todo 界面处理
handleErrorCode(msg.arg1);
Toast.makeText(FingerprintActivity.this, "验证错误", Toast.LENGTH_SHORT).show();
break;
case 2: //验证成功
//todo 界面处理
cancel = null;
Toast.makeText(FingerprintActivity.this, "验证成功", Toast.LENGTH_SHORT).show();
fingerprintDialog.dismiss();
break;
case 3: //验证失败
//todo 界面处理
cancel = null;
Toast.makeText(FingerprintActivity.this, "验证失败", Toast.LENGTH_SHORT).show();
break;
default:
super.handleMessage(msg);
}
}
});
fingerprintDialog = new FingerprintDialog(this);
fingerprintDialog.show();
fingerprintDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (cancel != null)
//取消验证
cancel.cancel();
cancel = null;
}
});
}
}