前言
指纹登录可实现应用程序的快速登录Android6.0谷歌提供统一的指纹SDK接口
今日介绍指纹登录功能;
一、app内指纹登录介绍
指纹识别是Android6.0以上是一个开始支持的功能,类别不多,主要是FingerprintManager还有它里面三个内部类(AuthenticationCallback、AuthenticationResult、CryptoObject);
指纹数据是在手机的设置中存储的,而不是自己写的APP的;
指纹识别只能识别,而不是APP输入指纹,想输入指纹,你想添加手机设置中的指纹功能,指纹识别功能是将用户放在感应区的指纹数据与手机设置中输入的指纹数据进行比较,然后进行成功和失败的回调,仅此而已;
二、指纹登录步骤详细说明
1、申请权限
Android清单文件中指纹的权限是
<uses-permissionandroid:name="android.permission.USE_FINGERPRINT"/>2、验证手机是否支持指纹
- FingerprintManagerCompat提供三种方法:
- isHardwareDetected() 判断是否有硬件支持
- isKeyguardSecure() 判断是否设置锁屏,因为手机至少有两种登录方式
hasEnrolledFingerprints() 判断系统中是否至少添加一个指纹
/***判断是否支持指纹识别*/publicstaticbooleansupportFingerprint(ContextmContext){if(Build.VERSION.SDK_INT<23){Toast.makeText(mContext,"您的系统版本太低,不支持指纹功能",Toast.LENGTH_SHORT).show();returnfalse;}else{KeyguardManagerkeyguardManager=mContext.getSystemService(KeyguardManager.class);FingerprintManagerCompatfingerprintManager=FingerprintManagerCompat.from(mContext);if(!fingerprintManager.isHardwareDetected()){Toast.makeText(mContext,"您的系统版本过低,不支持指纹功能",Toast.LENGTH_SHORT).show();returnfalse;}elseif(keyguardManager!=null&&!keyguardManager.isKeyguardSecure()){Toast.makeText(mContext,"您的手机不支持指纹功能",Toast.LENGTH_SHORT).show();returnfalse;}elseif(!fingerprintManager.hasEnrolledFingerprints()){Toast.makeText(mContext,"您至少需要在系统设置中添加指纹",Toast.LENGTH_SHORT).show();returnfalse;}}returntrue;}3、产生对称加密key
valDEFAULT_KEY_NAME="default_key"lateinitvarkeyStore:KeyStoreprivatefuninitKey(){keyStore=KeyStore.getInstance("AndroidKeyStore")keyStore.load(null)valkeyGenerator=KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES,"AndroidKeyStore")valbuilder=KeyGenParameterSpec.Builder(DEFAULT_KEY_NAME,KeyProperties.PURPOSE_ENCRYPTorKeyProperties.PURPOSE_DECRYPT).setBlockModes(KeyProperties.BLOCK_MODE_CBC).setUserAuthenticationRequired(true).setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)keyGenerator.init(builder.build())keyGenerator.generateKey()}4、生成一个Cipher对象
privatefuninitCipher(mContext:Context?){valkey=keyStore.getKey(DEFAULT_KEY_NAME,null)asSecretKeyvalcipher=Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES "/" KeyProperties.BLOCK_MODE_CBC "/" KeyProperties.ENCRYPTION_PADDING_PKCS7)cipher.init(Cipher.ENCRYPT_MODE,key)}5、打开指纹验证
privatevoidshowFingerPrintDialog(Contextcontext,Ciphercipher){FingerprintManagerCompatfingerprintManagerCompat=FingerprintManagerCompat.from(context);FingerprintManagerCompat.CryptoObjectcryptoObject=newFingerprintManagerCompat.CryptoObject(cipher);CancellationSignalmCancellationSignal=newCancellationSignal();///在识别过程中,指纹识别可以手动取消//mCancellationSignal.cancel();fingerprintManagerCompat.authenticate(cryptoObject,0,mCancellationSignal,newMyCallBack(),null);}6、指纹验证回调
publicclassMyCallBackextendsFingerprintManagerCompat.AuthenticationCallback{@OverridepublicvoidonAuthenticationError(interrMsgId,CharSequenceerrString){//当出现错误时,回调此函数,如多次尝试失败时,errString是错误信息一般来说,我们首先判断是否手动取消Log.e("TAG","errMsgId=" errMsgId);if(errMsgId==FingerprintManager.FINGERPRINT_ERROR_LOCKOUT){Log.e("TAG","" errString);}}///当指纹验证失败时,该函数将被回调。失败后,允许多次尝试。如果失败次数过多,将停止响应一段时间,然后停止sensor的工作@OverridepublicvoidonAuthenticationFailed(){//指纹认证失败,请再试一次Log.e("TAG","onAuthenticationFailed");}@OverridepublicvoidonAuthenticationHelp(inthelpMsgId,CharSequencehelpString){//错误时提示帮助,如指纹错误,我们将显示在界面上,让用户知道情况Log.e("TAG","helpString=" helpString);}///当验证的指纹成功时,将回调此函数,然后不再监控指纹sensor@OverridepublicvoidonAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResultresult){///这里我们可以取消弹框等Log.e("TAG","onAuthenticationSucceeded=" result.toString());}}指纹验证登录纹验证登录过程已经完成,不是很简单吗?
总结
指纹还有很多东西等着我们习,比如加密;
一起学习加油;