FragmentManager уже выполняет транзакции при выполнении biometricPrompt?.Authenticate(promptInfo) внутри фрагмента

Если вы создадите biometricPrompt и promptInfo в упражнении, оно будет работать нормально. Но я не могу заставить его работать внутри фрагмента.

Это внутри фрагмента и вызывается внутри OnViewCreated. Вы делаете то же самое в действии, это прекрасно работает, 1 решением было бы передать biometricPrompt и PromptInfo из действия и передать его внутри фрагмента.

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    tryToDisplayBiometricPrompt()
}


@TargetApi(Build.VERSION_CODES.M)
private fun tryToDisplayBiometricPrompt() {
    //Create a thread pool with a single thread
    biometricPrompt = BiometricPrompt(activity as FragmentActivity, Executors.newSingleThreadExecutor(), object : BiometricPrompt.AuthenticationCallback() {
        override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
            super.onAuthenticationSucceeded(result)
            authenticationSuccessful()
        }

        override fun onAuthenticationError(errorCode: Int, errString: CharSequence) {
            super.onAuthenticationError(errorCode, errString)
            if (errorCode == BiometricConstants.ERROR_NEGATIVE_BUTTON || errorCode == BiometricConstants.ERROR_USER_CANCELED || errorCode == BiometricPrompt.ERROR_CANCELED) return
            authenticationlistener?.isBiometricAvailable = false
            authenticationlistener?.onAuthenticationFailed()
        }
    })

    promptInfo = BiometricPrompt.PromptInfo.Builder()
            .setTitle(getString(R.string.biometric_title))
            .setSubtitle(getString(R.string.biometric_subtitle))
            .setDescription(getString(R.string.biometric_description))
            .setNegativeButtonText(getString(R.string.cancel))
            .build()

    biometricPrompt?.authenticate(promptInfo)
}

0 ответов

См. Ниже или тот же ответ здесь

Проблема устранена в androidx.biometric:biometric:1.0.0-beta01предоставив второй конструктор. До этого выпуска я решил проблему, вернувшись кalpha03 но сейчас доступно реальное решение.

Вы можете найти beta01примечания к выпуску здесь

Мы ввели второй конструктор для BiometricPrompt, который позволяет размещать его во фрагменте (в отличие от существующего конструктора, для которого требуется FragmentActivity).

Вы можете найти новое BiometricPromptдокументация конструктора здесь

BiometricPrompt(Fragment fragment, Executor executor, BiometricPrompt.AuthenticationCallback callback)

Чтобы исправить это, выполните простые шаги:

  1. Измените свой build.gradle, чтобы использовать биометрическую версию 1.0.0-beta01
  2. Используйте новый конструктор. Короче говоря, измените первый аргумент на фрагмент вместо действия. Смотрите мое изменение кода ниже:

    val biometricPrompt = BiometricPrompt(activity!!, executor, callback)
    // Change the above line to the below line
    val biometricPrompt = BiometricPrompt(this, executor, callback)
    
Другие вопросы по тегам