指紋驗(yàn)證登錄開(kāi)發(fā)流程詳解
前言
指紋登錄可以實(shí)現(xiàn)應(yīng)用的快捷登錄,在Android6.0谷歌才提供統(tǒng)一指紋SDK接口
今天我們來(lái)介紹下指紋登錄功能;
一、app里指紋登錄介紹
指紋識(shí)別是Android6.0以上就開(kāi)始支持的一個(gè)功能,并且類(lèi)也不多,主要就是FingerprintManager還有它里面三個(gè)內(nèi)部類(lèi)(AuthenticationCallback、AuthenticationResult、CryptoObject);
指紋數(shù)據(jù)是在手機(jī)的設(shè)置里面,不是存到自己寫(xiě)的APP的;
指紋識(shí)別就只能識(shí)別,而不能在APP中錄入指紋,想錄入指紋可以,自己要到手機(jī)設(shè)置里面的指紋功能自己去添加,指紋識(shí)別功能能做的就是把用戶放到感應(yīng)區(qū)的指紋數(shù)據(jù)與手機(jī)設(shè)置里面的已錄入的指紋數(shù)據(jù)進(jìn)行比對(duì),再執(zhí)行成功失敗的回調(diào),僅此而已;
二、指紋登錄步驟詳解
1、申請(qǐng)權(quán)限
Android清單文件中的指紋的權(quán)限是
- <uses-permission android:name="android.permission.USE_FINGERPRINT"/>
2、驗(yàn)證手機(jī)是否支持指紋
- FingerprintManagerCompat提供了三個(gè)方法:
- isHardwareDetected() 判斷是否有硬件支持
- isKeyguardSecure() 判斷是否設(shè)置鎖屏,因?yàn)橐粋€(gè)手機(jī)最少要有兩種登錄方式
hasEnrolledFingerprints() 判斷系統(tǒng)中是否添加至少一個(gè)指紋
- /**
- * 判斷是否支持指紋識(shí)別
- */
- public static boolean supportFingerprint(Context mContext) {
- if (Build.VERSION.SDK_INT < 23) {
- Toast.makeText(mContext, "您的系統(tǒng)版本過(guò)低,不支持指紋功能", Toast.LENGTH_SHORT).show();
- return false;
- } else {
- KeyguardManager keyguardManager = mContext.getSystemService(KeyguardManager.class);
- FingerprintManagerCompat fingerprintManager = FingerprintManagerCompat.from(mContext);
- if (!fingerprintManager.isHardwareDetected()) {
- Toast.makeText(mContext, "您的系統(tǒng)版本過(guò)低,不支持指紋功能", Toast.LENGTH_SHORT).show();
- return false;
- } else if (keyguardManager != null && !keyguardManager.isKeyguardSecure()) {
- Toast.makeText(mContext, "您的手機(jī)不支持指紋功能", Toast.LENGTH_SHORT).show();
- return false;
- } else if (!fingerprintManager.hasEnrolledFingerprints()) {
- Toast.makeText(mContext, "您至少需要在系統(tǒng)設(shè)置中添加一個(gè)指紋", Toast.LENGTH_SHORT).show();
- return false;
- }
- }
- return true;
- }
3、生成一個(gè)對(duì)稱(chēng)加密的key
- val DEFAULT_KEY_NAME = "default_key"
- lateinit var keyStore: KeyStore
- private fun initKey() {
- keyStore = KeyStore.getInstance("AndroidKeyStore")
- keyStore.load(null)
- val keyGenerator =
- KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore")
- val builder = KeyGenParameterSpec.Builder(DEFAULT_KEY_NAME,
- KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
- .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
- .setUserAuthenticationRequired(true)
- .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_PKCS7)
- keyGenerator.init(builder.build())
- keyGenerator.generateKey()
- }
4、生成一個(gè)Cipher對(duì)象
- private fun initCipher(mContext: Context?) {
- val key = keyStore.getKey(DEFAULT_KEY_NAME, null) as SecretKey
- val cipher = Cipher.getInstance(KeyProperties.KEY_ALGORITHM_AES + "/"
- + KeyProperties.BLOCK_MODE_CBC + "/"
- + KeyProperties.ENCRYPTION_PADDING_PKCS7)
- cipher.init(Cipher.ENCRYPT_MODE, key)
- }
5、開(kāi)啟指紋驗(yàn)證
- private void showFingerPrintDialog(Context context, Cipher cipher) {
- FingerprintManagerCompat fingerprintManagerCompat = FingerprintManagerCompat.from(context);
- FingerprintManagerCompat.CryptoObject cryptoObject = new FingerprintManagerCompat.CryptoObject(cipher);
- CancellationSignal mCancellationSignal = new CancellationSignal();
- //識(shí)別過(guò)程中可以手動(dòng)取消指紋識(shí)別
- //mCancellationSignal.cancel();
- fingerprintManagerCompat.authenticate(cryptoObject, 0, mCancellationSignal, new MyCallBack(), null);
- }
6、指紋驗(yàn)證回調(diào)
- public class MyCallBack extends FingerprintManagerCompat.AuthenticationCallback {
- @Override
- public void onAuthenticationError(int errMsgId, CharSequence errString) {
- //當(dāng)出現(xiàn)錯(cuò)誤的時(shí)候回調(diào)此函數(shù),比如多次嘗試都失敗了的時(shí)候,errString是錯(cuò)誤信息
- //一般來(lái)說(shuō)我們都是先判斷一下是不是自己手動(dòng)取消
- Log.e("TAG", "errMsgId=" + errMsgId);
- if (errMsgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT) {
- Log.e("TAG", "" + errString);
- }
- }
- //當(dāng)指紋驗(yàn)證失敗的時(shí)候會(huì)回調(diào)此函數(shù),失敗之后允許多次嘗試,失敗次數(shù)過(guò)多會(huì)停止響應(yīng)一段時(shí)間然后再停止sensor的工作
- @Override
- public void onAuthenticationFailed() {
- //指紋認(rèn)證失敗,請(qǐng)?jiān)僭囈淮?nbsp;
- Log.e("TAG", "onAuthenticationFailed");
- }
- @Override
- public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {
- //錯(cuò)誤時(shí)提示幫助,比如說(shuō)指紋錯(cuò)誤,我們將顯示在界面上 讓用戶知道情況
- Log.e("TAG", "helpString=" + helpString);
- }
- //當(dāng)驗(yàn)證的指紋成功時(shí)會(huì)回調(diào)此函數(shù),然后不再監(jiān)聽(tīng)指紋sensor
- @Override
- public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
- //這里我們可以做取消彈框之類(lèi)的
- Log.e("TAG", "onAuthenticationSucceeded=" + result.toString());
- }
- }
到此指紋驗(yàn)證登錄流程完了,是不是很簡(jiǎn)單;
總結(jié)
指紋這塊還有很多很多東西等著我們?nèi)W(xué)習(xí),比如加密等;
一起學(xué)習(xí)加油;