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)

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

  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)
    

Проблема все еще существует в последней версии 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)
    }
Другие вопросы по тегам