Android指纹识别
最近在工作中需要用到指纹识别,正好之前在android开发技术周报中看见一篇关于锁屏的文章,作者写的非常好,每个知识点都有详细的讲解,其中就包括指纹解锁,所以就拿来用用。末尾会附上链接。
准备工作
首先如果想使用android指纹识别,编译环境得是6.0的SDK并且拥有一个具有指纹识别的手机,如果没有也可以下一android模拟器,当然api得是23的这样在额外功能里面也可以使用指纹识别功能。
具体代码实现
首先需要了解的就是当前手机是否具有指纹识别功能,其次再判断指纹是否正确。
public boolean isFingerprintAuthAvailable() {
//判断当前手机版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//获得密码管理器
mKeyguardManager = (KeyguardManager) getSystemService(Activity.KEYGUARD_SERVICE);
//判断是否具有锁屏密码
if (!mKeyguardManager.isKeyguardSecure()) {
return false;
}
//判断APP是否具有指纹识别权限
if (checkSelfPermission(Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED) {
//获得指纹识别管理器对象
manager = (FingerprintManager) getSystemService(Activity.FINGERPRINT_SERVICE);
mCancellationSignal = new CancellationSignal();
//判断是否具有指纹识别的硬件设施和是否已经录好指纹
return manager.isHardwareDetected() && manager.hasEnrolledFingerprints();
}else{
return false;
}
}else{
return false;
}
}
代码上都有注释,基本都能看懂,checkSelfPermission()是ContextWrapper的方法,可以直接调用,这样在判断好是否有指纹识别功能之后。接下来就是验证指纹了。
private void startFingerPrintListener() {
if (!isFingerprintAuthAvailable()) {
tv.setText("您的手机暂不支持指纹识别");
return;
} else {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.USE_FINGERPRINT) == PackageManager.PERMISSION_GRANTED) {
//主要方法:指纹验证
manager.authenticate(null,mCancellationSignal,0,new MyCallBack(),null);
return;
}
}
}
}
其中最主要的方法就是authenticate()方法,需要五个参数。
其中,crypto参数代表Android6.0中crypto objects的wrapper class,可以通过该对象使authenticate过程更加安全,也可以不使用,这里我们将其设为null;cancel用来取消anthenticate(),我们new出一个对象传入就可以;flags是标志位,设置为0;callback为指纹识别回调,包含指纹识别的核心方法:onAuthenticationError()是指纹匹配连续失败后的回调(几十秒后才能继续匹配),onAuthenticationSucceeded()是指纹匹配成功的回调,onAuthenticationFailed()是指纹匹配失败时的回调。我们在这几个方法中做相应的处理即可。
引用自 腾讯Bugly(http://bugly.qq.com)
接下来就看一下回调都有什么。
public class MyCallBack extends FingerprintManager.AuthenticationCallback{
private static final String TAG="MyCallBack";
@Override
public void onAuthenticationError(int errMsgId, CharSequence errString) {
// TODO Auto-generated method stub
Log.d(TAG, "onAuthenticationError: " + errString);
tv.setText("出现错误");
}
@Override
public void onAuthenticationFailed() {
// TODO Auto-generated method stub
Log.d(TAG, "onAuthenticationFailed: " + "校验失败");
tv.setText("校验失败");
}
@Override
public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
Log.d(TAG, "onAuthenticationHelp: " + helpString);
}
@Override
public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
Log.d(TAG, "onAuthenticationSucceeded: " + "校验成功");
tv.setText("校验成功");
}
}
一共有四个回调方法,看方法名就可以很好的理解了。到这里,指纹识别就基本结束了,其实听起来好高大上,写起来也不是很难,当然这收拾踩在巨人的肩上,非常感谢那些无私奉献的知识大神们,追随他们的脚步,我们可以走的更远。