1. 程式人生 > >利用Android-FingerprintManager類實現指紋識別

利用Android-FingerprintManager類實現指紋識別

安卓指紋識別

利用FingerprintManager主類進行指紋識別。

在安卓6.0中新增了API,FingerprintManager類,它是Google提供的幫助訪問指紋硬體的API類

新增API許可權的過程如下

   ContextCompact.checkSelfPermission  // 檢查APP是否擁有某許可權
   ActivityCompat.requestPermissions()  // 如果沒有就去申請
   onRequestPermissionResult()  //非同步執行回撥結果
   ActivityCompat.shouldShowRequestPermissionRationale // 用於給使用者解釋許可權用途

AndroidManifest許可權宣告

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

FingerprintManager類

三個主要方法

  1. authenticate(...) 啟動指紋識別
  2. hasEnrolledFingerprints() 判斷是否錄入有指紋
  3. isHardwareDetected() 判斷是否有硬體支援

實現要點

1 . 判斷是否硬體支援

    if (!mManager.isHardwareDetected()) {
       Toast.makeText(mContext, "沒有指紋識別模組", Toast.LENGTH_SHORT).show();
       return false;
     }

2 . 檢查手機是否已錄入指紋

if (!mManager.hasEnrolledFingerprints()) {
    Toast.makeText(mContext, "沒有指紋錄入", Toast.LENGTH_SHORT).show();
    return false;
}

3 . 建立指紋開啟的回撥方法

這裡就該引入上面所說的FingerprintManager的三個內部類了

①FingerPrintManager.AuthenticationCallback: 在驗證時傳入該介面,通過該介面來返回驗證指紋的結果

②FingerPrintManager.AuthenticationResult: 當指紋驗證正確時,接口裡返回的引數

③FingerPrintManager.CryptoObject: 由FingerPrintManager支援的封裝加密物件的類

只要指紋識別的結果,只需要AuthenticationCallback類即可。 這一步我們就建立AuthenticationCallback類物件。

FingerprintManager.AuthenticationCallback mSelfCancelled = new FingerprintManager.AuthenticationCallback() {
    @Override
    public void onAuthenticationError(int errorCode, CharSequence errString) {
        //多次指紋密碼驗證錯誤後,進入此方法;並且,不可再驗(短時間)
        //errorCode是失敗的次數
        ToastUtils.show(mContext, "嘗試次數過多,請稍後重試", 3000);
    }

    @Override
    public void onAuthenticationHelp(int helpCode, CharSequence helpString) {
        //指紋驗證失敗,可再驗,可能手指過髒,或者移動過快等原因。
    }

    @Override
    public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
        //指紋密碼驗證成功
    }

    @Override
    public void onAuthenticationFailed() {
        //指紋驗證失敗,指紋識別失敗,可再驗,錯誤原因為:該指紋不是系統錄入的指紋。
    }
};

4 . 開啟指紋識別

只需要傳參即可。

mManager.authenticate(null, mCancellationSignal, 0, mSelfCancelled, null);

擴充套件小貓糧:

一. authenticate引數說明

/**
 * 引數說明:
 * FingerprintManager.CryptoObject - 用於通過指紋驗證取出AndroidKeyStore中的key的物件,用於加密
 * CancellationSignal - 用來取消指紋驗證,如果想手動關閉驗證,可以呼叫該引數的cancel方法
 * int - 沒什麼意義,就是傳0就好了
 * FingerprintManager.AuthenticationCallback -  最重要,由於指紋資訊是存在系統硬體中的,app是不可以訪問指紋資訊的,所以每次驗證的時候,系統會通過這個callback告訴你是否驗證通過、驗證失敗等
 * Handler - FingerPrint中的訊息都通過這個Handler來傳遞訊息,如果你傳空,則預設建立一個在主執行緒上的Handler來傳遞訊息,沒什麼用,傳null好了
 */
public void authenticate(FingerprintManager.CryptoObject crypto, CancellationSignal cancel, int flags, FingerprintManager.AuthenticationCallback callback, Handler handler)

但我們今天不站隊,而是從另外一個“詭異”視角,去審視一下什麼是生命,什麼是人工智慧

想象一下你獲得了一種能力——你的夢境是連續的,每天睡著之後,你都會來到一個與現實世界不同、但與前一天的夢境相同的環境中。