将androidx biometric更新为1.0.0-alpha04后,Android崩溃

cha*_*lav 9 android biometrics kotlin androidx android-biometric-prompt

一切正常'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)
Run Code Online (Sandbox Code Playgroud)

有人知道发生了什么事和怎么做吗?现在,我将坚持使用1.0.0-alpha03版本

谢谢!

ole*_*234 6

androidx.biometric:biometric:1.0.0-beta01通过提供第二个构造函数解决了这个问题。在此版本之前,我通过恢复到解决了该问题,alpha03但现在有一个实际的解决方案可用。

您可以在此处找到beta01发行说明

我们为 BiometricPrompt 引入了第二个构造函数,允许将其托管在 Fragment 中(与现有构造函数相反,后者需要 FragmentActivity)。

您可以在此处找到新的BiometricPrompt构造函数文档

BiometricPrompt(Fragment fragment, Executor executor, BiometricPrompt.AuthenticationCallback callback)
Run Code Online (Sandbox Code Playgroud)

要修复,请按照简单的步骤操作:

  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)
    
    Run Code Online (Sandbox Code Playgroud)


Rud*_*udy 5

编辑:该问题似乎已解决,请参阅@ olearyj234的注释/答案以正确的方法来解决beta01及更高版本的问题。

-

alpha04似乎存在问题,恢复为alpha03即可解决。猜猜我们将不得不等待alpha05才能升级。

只是希望Google等到生物识别库超出alpha版本后才弃用指纹库...

  • 认真地,他们甚至对此进行了抽烟测试吗?甚至调用BiometricPrompt.authenticate的简单用例也会为我产生此错误,它不像在某些奇怪的极端情况下发生的那样。让我觉得他们甚至没有对此进行质量检查。Alpha3也充满了令人尴尬的错误。曾经为此工作的人应该被解雇。 (3认同)