Android рухнул после обновления androidx biometric до 1.0.0-alpha04
Все отлично работает с 'androidx.biometric:biometric:1.0.0-alpha03'
Однако, когда я строю свой проект с последней 'androidx.biometric:biometric:1.0.0-alpha04'
и позвонить myBiometricPrompt.authenticate(promptInfo)
это бросает это исключение: FragmentManager is already executing transactions
,
Вот трассировка стека:
java.lang.IllegalStateException: FragmentManager is already executing transactions
at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2207)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2267)
at androidx.fragment.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:814)
at androidx.biometric.BiometricPrompt.authenticateInternal(BiometricPrompt.java:525)
at androidx.biometric.BiometricPrompt.authenticate(BiometricPrompt.java:465)
at com.my.app.ui.LoginFragment.handleTouchIdAuth(LoginFragment.kt:161)
at com.my.app.ui.LoginFragment.onViewCreated(LoginFragment.kt:62)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1471)
at androidx.fragment.app.FragmentManagerImpl.addAddedFragments(FragmentManager.java:2646)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2416)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2372)
at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3273)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2466)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1483)
at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
at androidx.fragment.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3269)
at androidx.fragment.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:3229)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:201)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:620)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:178)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1391)
at android.app.Activity.performStart(Activity.java:7157)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:2937)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Кто-нибудь знает, что случилось и что делать? Сейчас я буду придерживаться версии 1.0.0-alpha03
Спасибо!
1 ответ
Кажется, есть проблема с alpha04, возврат к alpha03 исправляет ее. Думаю, нам придется подождать alpha05 перед обновлением.
Просто хотелось бы, чтобы Google подождал, пока библиотека биометрических данных выйдет из альфы, прежде чем объявить библиотеку отпечатков пальцев устаревшей
Проблема устранена в 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)
Проблема все еще существует в последней версии androidx.biometric:biometric:1.0.0-beta01
.
Чтобы исправить это, нужно отобразить biometricPrompt от обработчика:
val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle(fragmentActivity.getString(title))
.setNegativeButtonText(fragmentActivity.getString(negativeButtonText))
.build()
val biometricPrompt = BiometricPrompt(...)
// display biometricPrompt from handler
Handler().post {
biometricPrompt.authenticate(promptInfo)
}