指紋適配記錄Android9.0

KosmoSakura發表於2018-12-18

注意:系統預設的每段時間驗證指紋次數為5次 次數用完之後自動關閉驗證,並且30秒之內不允行在使用驗證

指紋驗證根據Api分兩個階段

  • 第一階段:api小於Build.VERSION_CODES.M(Android 6.0=23),系統不支援指紋系統。(部分定製(紅米)手機暫不考慮)
  • 第二階段:api小於Build.VERSION_CODES.P(Android 9.0=28),谷狗封裝了support,上面那個過時了

零.許可權

許可權(不用動態申請):

<uses-permission android:name="android.permission.USE_FINGERPRINT"/>

一.第一階段

Api小於23,做法:彈個吐司說,你手機太撇。

23<= Api <28,的做法是通過指紋管理類:FingerprintManager

工具類原始碼

1.0.獲取例項[指紋管理器]

private FingerprintManager fingerMgr;

private UFinger() {
    fingerMgr = (FingerprintManager)KApp.getInstance().
        getSystemService(Context.FINGERPRINT_SERVICE);
}

1.1.是否有指紋硬體

public boolean hasFingerHard() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return false;
    }
    if (fingerMgr == null) {
        return false;
    }
    return fingerMgr.isHardwareDetected();
}

1.2.是否有錄入指紋

public boolean hasFingerInput() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return false;
    }
    if (fingerMgr == null) {
        return false;
    }
    return fingerMgr.hasEnrolledFingerprints();
}

1.3.指紋識別

@RequiresApi(api = Build.VERSION_CODES.M)
public void authenticate() {
    fingerMgr.authenticate(null, new CancellationSignal(), 0, new FingerprintManager.AuthenticationCallback() {
        @Override
        public void onAuthenticationError(int errorCode, CharSequence errString) {
            //指紋驗證失敗
            if (listener != null) {
                listener.onResult(false, "指紋不匹配");
            } 
        }

        @Override
        public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
            //指紋驗證成功
            //result這裡的result是指紋資料,需要相應的key才能拿出來用
            if (listener != null) {
                listener.onResult(false, "驗證成功");
            }
        }

        @Override
        public void onAuthenticationFailed() {
           //多次指紋驗證錯誤後,回撥此方法;
           //並且,(第一次錯誤)由系統鎖定30s
            if (listener != null) {
                listener.onResult(false, "多次錯誤,暫時鎖定");
            }
        }
    },null);
}

二、第二階段

Android P,指紋管理器FingerprintManager被谷狗的 生物識別BiometricPrompt替換。(現在面部、虹膜等現在還只有一個佔位)

雖然是提出的方法是基於Android P,但是谷狗封裝的Android support或者AndroidX中已經對低版本做了相容,所以可以直接使用FingerprintManagerCompat

工具類原始碼

2.0.獲取例項[指紋管理器]

private final FingerprintManagerCompat compat;
private UBiometric() {
    compat = FingerprintManagerCompat.from(KApp.getInstance());
}

2.1.是否有指紋硬體

public boolean hasFingerHard() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return false;
    }
    if (compat == null) {
        return false;
    }
    return compat.isHardwareDetected();
}

2.2.是否有錄入指紋

public boolean hasFingerInput() {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return false;
    }
    if (compat == null) {
        return false;
    }
    return compat.hasEnrolledFingerprints();
}

2.3.指紋識別

public void authenticate(FingerListener listener) {
    //必須重新例項化。cancel過,資源會被釋放,
    cancelSignal = new CancellationSignal();
    compat.authenticate(null,//用於通過指紋驗證取出AndroidKeyStore中key的值
                        0,//系統建議為0,其他值,谷狗佔位用於其他生物驗證
                        cancelSignal,//強制取消指紋驗證
                        new FingerprintManagerCompat.AuthenticationCallback() {
                            @Override
                            public void onAuthenticationError(int errMsgId, CharSequence errString) {
	                              if (listener != null) {
				                        listener.onResult(false, "指紋不匹配");
				                  }
                            }

                            @Override
                            public void onAuthenticationFailed() {
                               //多次指紋驗證錯誤後,回撥此方法;
                    			//並且,(第一次錯誤)由系統鎖定30s
			                    if (listener != null) {
			                        listener.onResult(false, "多次錯誤,暫時鎖定");
			                    }
                            }

                            @Override
                            public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
                                //指紋驗證成功
                                //result這裡的result是指紋資料,需要相應的key才能拿出來用
                                if (listener != null) {
                                    listener.onResult(true, "驗證成功");
                                }
                            }
                        }, null);// 內部驗證訊息通過Handler傳遞,不需要,傳空
}

一般,還會有判斷系統是否設定過鎖屏這個操作,不過我覺得沒有必要,因為,現在錄入指紋,自動就鎖屏了

相關文章