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)
Чтобы исправить это, выполните простые шаги:
- Измените свой build.gradle, чтобы использовать биометрическую версию
1.0.0-beta01
Используйте новый конструктор. Короче говоря, измените первый аргумент на фрагмент вместо действия. Смотрите мое изменение кода ниже:
val biometricPrompt = BiometricPrompt(activity!!, executor, callback) // Change the above line to the below line val biometricPrompt = BiometricPrompt(this, executor, callback)