Android BiometricPrompt DeviceCredentialHandler: onCreate: Executor и / или обратный вызов имеют значение null

Похоже, в BiometricPrompt 1.0.0 есть ошибка. где он остается в невидимом состоянии, выбрасывая это исключение

Я предлагаю обходной путь в ответе

ИЗМЕНИТЬ (спасибо @Isai Damier):

Способ воспроизведения:

  1. откройте BiometricPrompt
  2. нажать кнопку назад - закрыть подсказку
  3. снова нажмите и выйдите из приложения
  4. вернуться в приложение - попробуйте снова открыть подсказку

person gor    schedule 13.11.2019    source источник
comment
Вопрос не указывает, в чем заключается ошибка. Что нужно сделать, чтобы воссоздать ошибку?   -  person Isai Damier    schedule 19.12.2019


Ответы (1)


это исправление было введено, когда версия биометрических подсказок была 1.0.0. эта проблема воспроизводится в 1.0.1

//-------------------------------------------------------------------------

Я придумал обходной путь - вызовите «cancelAuthentication» в подсказке после отмены пользователя.

Полный код выглядит следующим образом (используется в нативном приложении для реакции - поэтому обещание предназначено для):

    private const val E_BIOMETRIC_ERR = "E_FINGER_PRINT_ERR"
    private const val OPENED = "success"
    private var bp: BiometricPrompt? = null
    private var mAuthenticationPromise: Promise? = null

    fun authenticate(activity: AppCompatActivity, title: String,
                     subTitle: String, description: String, authenticationPromise: Promise) {
        mAuthenticationPromise = authenticationPromise

        val executor = Executors.newSingleThreadExecutor()

        bp?.cancelAuthentication()
        bp = getBiometricPrompt(activity, executor)

        val promptInfo = BiometricPrompt.PromptInfo.Builder()
                .setTitle(title)
                .setSubtitle(subTitle)
                .setDescription(description)
                .setDeviceCredentialAllowed(true)
                .build()

        bp!!.authenticate(promptInfo)

    }



    private fun getBiometricPrompt(activity: AppCompatActivity, executor: Executor): BiometricPrompt {
        return BiometricPrompt(activity, executor, object : BiometricPrompt.AuthenticationCallback() {

            override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
                super.onAuthenticationSucceeded(result)
                mAuthenticationPromise?.resolve(OPENED)
            }

            override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
                super.onAuthenticationError(errorCode, errString)
                bp!!.cancelAuthentication()
            }

            override fun onAuthenticationFailed() {
                super.onAuthenticationFailed()
                bp!!.cancelAuthentication()
            }
        })
    }

Надеюсь, это кому-нибудь поможет - ура

person gor    schedule 13.11.2019
comment
Привет! Я пробовал ваше решение, но оно не работает ... но если вы включите метод воссоздания () в onAuthenticationError () и onAuthenticationSucceeded (), работает отлично !! - person fesave; 21.11.2019
comment
Отлично, попробуй и перепубликуй - person gor; 21.11.2019
comment
Хорошо, теперь я понимаю, когда вы написали воссоздать - я не хочу влиять на жизненный цикл активности - я просто хочу открыть-закрыть-снова открыть приглашение - вот почему я в первую очередь сохранил bp. В любом случае спасибо @fesave - person gor; 21.11.2019