天天看點

android 簡單實作指紋識别功能

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

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

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

先看一張效果圖:

android 簡單實作指紋識别功能

廢話不多說直接上代碼吧:

要想檢視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源碼