自定义视图android中出现"FINGERPRINT_ERROR_CANCELED"错误

Muh*_*tiq 6 android android-custom-view screen-lock android-fingerprint-api

我正在尝试通过指纹识别来实现指纹解锁或删除锁定视图,使用传感器现有的登记指纹进一步显示内容,但指纹认证在正常活动中正常工作但在自定义视图中无效,我也试图实现它在我的自定义屏幕锁定应用程序但其冲突或可能是由于资源不可用面临此错误"FINGERPRINT_ERROR_CANCELED"错误代码5

我不确定它是否由于资源不可用,因为同时内置安全密码/模式锁也使用相同的指纹传感器以及我自己的屏幕锁或自定义视图

此代码在活动中运行良好的代码

 fingerprintHandler = new FingerprintHandler();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            keyguardManager =
                    (KeyguardManager) getSystemService(KEYGUARD_SERVICE);
            mFingerprintManager =
                    (FingerprintManager) getSystemService(FINGERPRINT_SERVICE);

//
//            generateKey();
//            if (cipherInit()) {
//                cryptoObject =
//                        new FingerprintManager.CryptoObject(cipher);
            fingerprintHandler.setOnAuthenticationListener(new FingerprintManager.AuthenticationCallback() {
                @RequiresApi(api = Build.VERSION_CODES.M)
                @Override
                public void onAuthenticationError(int errorCode, CharSequence errString) {
                    Toast.makeText(FingerprintNormalActivity.this,
                            "Authentication error\n" + "Error code" + errorCode + "\nError String" + errString,
                            Toast.LENGTH_LONG).show();
                    imageViewSmokeImages.setImageResource(R.drawable.fingerprinterror);
                    tvstatus.setText("Authentication error\n" + "Error code" + errorCode + "\nError String" + errString);
                }

                @RequiresApi(api = Build.VERSION_CODES.M)
                @Override
                public void onAuthenticationHelp(int helpCode, CharSequence helpString) {`enter code here`
                    Toast.makeText(FingerprintNormalActivity.this,
                            "Authentication help\n" + helpString,
                            Toast.LENGTH_LONG).show();
                    imageViewSmokeImages.setImageResource(R.drawable.help);
                    tvstatus.setText("Authentication help\n" + helpString);

                }

                @Override
                public void onAuthenticationSucceeded(FingerprintManager.AuthenticationResult result) {
                    Toast.makeText(FingerprintNormalActivity.this,
                            "Authentication succeeded.",
                            Toast.LENGTH_LONG).show();
                    imageViewSmokeImages.setImageResource(R.drawable.fingerprintsuccess);
                    tvstatus.setText("Authentication Successfull");

                    finish();
                }

                @RequiresApi(api = Build.VERSION_CODES.M)
                @Override
                public void onAuthenticationFailed() {
                    Toast.makeText(FingerprintNormalActivity.this,
                            "Authentication failed.",
                            Toast.LENGTH_LONG).show();
                    tvstatus.setText("Authentication failed");

                    imageViewSmokeImages.setImageResource(R.drawable.fingerprintfailed);


                }
            });
//            new AuthenticateUser();

////                fingerprintHandler.startListening();
            if (!getKeyStore())
                return;

            if (!createNewKey(false)) {
                return;
            }
            if (!getCipher()) {
                return;
            }
            if (!initCipher(Cipher.ENCRYPT_MODE)) {
                return;
            }
            if (!initCryptObject()) {
                return;
            } else {
                fingerprintHandler.startListening(cryptoObject);
            }
//            }
        }
Run Code Online (Sandbox Code Playgroud)

这是我的指纹处理课程

private static FingerprintManager.AuthenticationCallback mAuthenticationCallback;
    private static CancellationSignal mCancellationSignal;
    private static Context mContext;

    @RequiresApi(api = Build.VERSION_CODES.M)
    public class FingerprintHandler {

        public void setOnAuthenticationListener(FingerprintManager.AuthenticationCallback listener) {
            mAuthenticationCallback = listener;
        }

        public void startListening() {
            if (isFingerScannerAvailableAndSet()) {
                try {
                    mCancellationSignal = new CancellationSignal();
                    mFingerprintManager.authenticate(null, mCancellationSignal, 0 /* flags */, mAuthenticationCallback, new Handler(Looper.getMainLooper()));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        public void startListening(FingerprintManager.CryptoObject cryptoObject) {
            if (isFingerScannerAvailableAndSet()) {
                try {
                    mCancellationSignal = new CancellationSignal();
                    mFingerprintManager.authenticate(cryptoObject, mCancellationSignal, 0 /* flags */, mAuthenticationCallback, new Handler(Looper.getMainLooper()));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        public void stopListening() {
            if (isFingerScannerAvailableAndSet()) {
                try {
                    mCancellationSignal.cancel();
                    mCancellationSignal = null;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        public boolean isFingerScannerAvailableAndSet() {
            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
                return false;
            if (ActivityCompat.checkSelfPermission(FingerprintNormalActivity.this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) {
                Toast.makeText(FingerprintNormalActivity.this, "User hasn't granted permission to use Fingerprint", Toast.LENGTH_LONG).show();
                return false;
            }
            if (mFingerprintManager == null){
                Toast.makeText(FingerprintNormalActivity.this,
                        "mFingerprintManager is null",
                        Toast.LENGTH_LONG).show();
                tvstatus.setText("mFingerprintManager is null");
                return false;
            }
            if (!mFingerprintManager.isHardwareDetected()) {
                Toast.makeText(FingerprintNormalActivity.this,
                        "fingerprint hardware not present or not functional",
                        Toast.LENGTH_LONG).show();
                tvstatus.setText("fingerprint hardware not present or not functional");
                return false;
            }
            if (!mFingerprintManager.hasEnrolledFingerprints()) {
                Toast.makeText(FingerprintNormalActivity.this,
                        "no fingerprint enrolled/saved",
                        Toast.LENGTH_LONG).show();
                tvstatus.setText("no fingerprint enrolled/saved");
                return false;
            }
            return true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

Nul*_*ter 5

看到这个问题.这似乎发生在大多数设备上,需要作为一个特例来处理.对我来说似乎有用的是在此错误上停止指纹监听器,然后再次重新启动它.

@Override
    public void onAuthenticationError(int errMsgId, CharSequence errString)            {
     if (errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED){
         stopListening();
         restartListeningToFingerprint();
     }
}
Run Code Online (Sandbox Code Playgroud)

在restartListening()方法中,我只startListening使用新的Cipher实例调用.这似乎适用于我拥有的所有设备.但我确实看到一些随机致命的例外,一些三星设备可能是这种副作用.我很想知道其他人是如何处理这个错误的.