使用Android Native API两次发生FINGERPRINT_ERROR_LOCKOUT回调

时间:2017-07-11 11:35:03

标签: android android-fingerprint-api

我正在为我们的某个应用程序实现android原生指纹API。 下面是处理程序的代码:

 public class FingerprintHandler extends
            FingerprintManager.AuthenticationCallback {

        private CancellationSignal cancellationSignal;
        private Context appContext;
        private boolean sendCancellation=false;

        public FingerprintHandler(Context context) {
            appContext = context;
        }
        public void startAuth(FingerprintManager manager,
                              FingerprintManager.CryptoObject cryptoObject) {

            cancellationSignal = new CancellationSignal();

            if (ActivityCompat.checkSelfPermission(appContext,
                    Manifest.permission.USE_FINGERPRINT) !=
                    PackageManager.PERMISSION_GRANTED) {
                return;
            }
            manager.authenticate(cryptoObject, cancellationSignal, 0, this, null);
        }
        @Override
        public void onAuthenticationError(int errMsgId,
                                          CharSequence errString) {
            Log.d(TAG,"Authentication error callback");
            Log.d(TAG,"Error Value: "+errMsgId);
            switch(errMsgId){
                case FINGERPRINT_ERROR_LOCKOUT:
                    Log.d(TAG,"Fingerprint error lockout");
                    nativeLocked = true;
                    mPreferences.edit().putLong(LAST_FAILURE, System.currentTimeMillis()).apply();
                    showError(getString(R.string.test_bio_fingerprint_fingerprint_authentication_failed));
                    mCancelButton.setEnabled(true);
                    dialogHandler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mCancelButton.setEnabled(true);
                            dismissDialog();
                            sendFailure();

                        }
                    }, SUCCESS_OR_FAIL_DELAY_MILLIS);
                    break;
                case FINGERPRINT_ERROR_CANCELED:
                Log.d(TAG,"Fingerprint has been cancelled");
                if(sendCancellation) {
                    dismissDialog();
                    if (useEye)
                        sendCancelForEye();
                    else
                        sendCancel();
                }
                    break;
            }
        }

        @Override
        public void onAuthenticationHelp(int helpMsgId,
                                         CharSequence helpString) {

            Log.d(TAG,"Authentication helper callback");
            retryWithError(R.string.test_bio_fingerprint_fingerprint_too_fast);
        }

        @Override
        public void onAuthenticationFailed() {
            Log.d(TAG,"Authentication failed callback");
            retryWithError(R.string.test_bio_fingerprint_fingerprint_not_recognized);
        }

        @Override
        public void onAuthenticationSucceeded(
                FingerprintManager.AuthenticationResult result) {
            Log.d(TAG,"Authentication successfull callback");
            onAuthenticationSuccess();

        }
        public void stopListening(boolean sendCancellation) {
            this.sendCancellation=sendCancellation;
            Log.d(TAG,"stopListening called");
            if (cancellationSignal != null) {
                cancellationSignal.cancel();
                cancellationSignal = null;
            }
        }
    }

问题是当有5次不正确的身份验证尝试时,我可以在我的日志中看到以下内容:

Authentication error callback
Error Value: 7
Fingerprint error lockout
Authentication error callback
Error Value: 7
Fingerprint error lockout

锁定回叫获得两次。我无法弄清楚为什么会这样。有人可以帮忙。

1 个答案:

答案 0 :(得分:0)

您需要检查errMsgId,因为第一次是为您的操作回调触发的,而第二次是为“指纹操作已取消”触发的。 还请注意,不建议使用FingerPrintManager,对于BiometricPrompt的新api,实现应类似于以下示例(您需要使用操作ID代码替换BiometricConstants.ERROR_NEGATIVE_BUTTON):

 @Override
        public void onAuthenticationError(int errorCode,
                                          @NonNull CharSequence errString) {
            super.onAuthenticationError(errorCode, errString);
            if (BiometricConstants.ERROR_NEGATIVE_BUTTON == errorCode) {
                //do your job only once
            }
        }