android 簡單實現指紋識別功能

snowzhao210發表於2018-09-28

android6.0以後就提供了指紋識別功能,但是由於android手機被各大廠商弄的層次不齊,所以android的指紋識別使用的比較少,但是由於現在老的智慧手機被淘汰的差不多了,新手機幾乎無一不支援指紋解鎖的,所以android也可以搞起指紋識別來了,使使用更方便。

指紋驗證的思路大概是這樣的:

  • 1.裝置是否支援指紋識別
  • 2.裝置是否處於安全保護中(有指紋識別的手機,在使用指紋識別的時候,還需要強制設定密碼解鎖,如果未設定的話是不許使用指紋識別的)
  • 3.裝置是否已經註冊過指紋(如果使用者未使用過這個指紋技術,那麼只能提示使用者到系統設定裡面去設定)

先看一張效果圖:

廢話不多說直接上程式碼吧:

要想檢視google文件的請點這裡

第一步:在AndroidManifest.xml中申明許可權:

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

此許可權不需要動態去申請,直接註冊就可以;關於哪些許可權需要去動態申請可以檢視鴻洋大神的這篇部落格:

http://blog.csdn.net/lmj623565791/article/details/50709663

第二步:獲取指紋管理類:

  //這種是使用系統服務,但是必須要在sdk為23以上版本才行
//        FingerprintManager fingerprintManager = (FingerprintManager) getSystemService(Context.FINGERPRINT_SERVICE);
        //這種使用的是v4的相容包,推薦使用這種
        managerCompat = FingerprintManagerCompat.from(MyApplication.appContext);
 public boolean checkIsFinger() {
        //判斷當前手機版本
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//            if (ActivityCompat.checkSelfPermission(MyApplication.appContext, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
//                ToastUtils.getInstance().showToast("沒有指紋識別許可權");
//                return false;
//            }
            Log.e(TAG, "有指紋許可權");
            //判斷硬體是否支援指紋識別
            if (!managerCompat.isHardwareDetected()) {
                ToastUtils.getInstance().showToast("沒有指紋識別模組");
                return false;
            }
            Log.e(TAG, "有指紋模組");
            //判斷 是否開啟鎖屏密碼
            if (!keyguardManager.isKeyguardSecure()) {
                ToastUtils.getInstance().showToast("沒有開啟鎖屏密碼");
                return false;
            }
            //判斷是否有指紋錄入
            if (!managerCompat.hasEnrolledFingerprints()) {
                ToastUtils.getInstance().showToast("沒有錄入指紋");
                return false;
            }
            return true;
        } else {
            ToastUtils.getInstance().showToast("裝置系統版本太低不支援指紋識別");
            return false;
        }
    }
 /**
     * 開始識別指紋
     *
     * @param listener
     */
    public void callFingerPrint(final FingerRecognitionCallBack listener) {
        authentFailedTimes = 0;
        if (listener != null)
            listener.onAuthenticationStart(); //開始指紋識別
        cancellationSignal = new CancellationSignal(); //必須重新例項化,否則cancel 過一次就不能再使用了
        managerCompat.authenticate(null, 0, cancellationSignal, new FingerprintManagerCompat.AuthenticationCallback() {
            // 驗證出錯回撥 指紋感測器會關閉一段時間,在下次呼叫authenticate時,會出現禁用期(時間依廠商不同30,1分都有)
            @Override
            public void onAuthenticationError(int errMsgId, CharSequence errString) {
                if (listener != null)
                    listener.onAuthenticationError(errMsgId, errString);
            }

            // 驗證失敗  指紋驗證失敗後,指紋感測器不會立即關閉指紋驗證,系統會提供5次重試的機會,即呼叫5次onAuthenticationFailed後,才會呼叫onAuthenticationError
            @Override
            public void onAuthenticationFailed() {
                authentFailedTimes++;
                if (listener != null)
                    listener.onAuthenticationFailed(authentFailedTimes);
            }

            @Override
            public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {//比如手指移動太快等情況
                if (listener != null)
                    listener.onAuthenticationHelp(helpMsgId, helpString);
            }

            // 當驗證的指紋成功時會回撥此函式,然後不再監聽指紋sensor
            @Override
            public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
                if (listener != null)
                    listener.onAuthenticationSucceeded(result);
            }
        }, null);
    }
if (FingerUnlockUtil.init().checkIsFinger()) {
                    final AlertDialog dia = localBuilder.show();
                    FingerUnlockUtil.init().callFingerPrint(new FingerRecognitionCallBackHelper() {

                        @Override
                        public void onAuthenticationError(int errMsgId, CharSequence errString) {
                            dia.dismiss();
                            ToastUtils.getInstance().showToast("驗證錯誤===" + String.valueOf(errString));
                        }

                        @Override
                        public void onAuthenticationFailed(int failedTimes) {
                            ToastUtils.getInstance().showToast("已經驗證錯誤===" + failedTimes + "次");
                        }

                        @Override
                        public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) {//可以不用實現
                            ToastUtils.getInstance().showToast("驗證幫助===" + String.valueOf(helpString));
                        }

                        @Override
                        public void onAuthenticationSucceeded(FingerprintManagerCompat.AuthenticationResult result) {
                            dia.dismiss();
                            ToastUtils.getInstance().showToast("驗證成功===");
                        }
                    });
                }

 

這裡就結束了,是不是很簡單呢,可以點選這裡下載原始碼:demo原始碼

 

相關文章