【问题标题】:Android crashed after updating androidx biometric to 1.0.0-alpha04Android 在将 androidx 生物识别更新为 1.0.0-alpha04 后崩溃
【发布时间】:2019-04-15 06:01:32
【问题描述】:

使用'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

版本

谢谢!

【问题讨论】:

标签: android kotlin androidx biometrics android-biometric-prompt


【解决方案1】:

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

您可以找到beta01 发行说明here

我们为 BiometricPrompt 引入了第二个构造函数,它允许 它被托管在一个片段中(与现有的构造函数相反, 这需要一个 FragmentActivity)。

你可以找到新的BiometricPrompt构造函数文档here

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-beta02 和上面的构造函数。我在测试时没有发现这个问题,但是我在 playstore 上看到了很多崩溃,包括像 Pixel3 这样的设备。我应该恢复到 androidx.biometric:biometric:1.0.0-beta01 吗?
  • 我有一个像素 3,我没有遇到问题。现在有一个RC,所以试试看。 androidx.biometric:biometric:1.0.0-rc01
【解决方案2】:

编辑:问题似乎已解决,请参阅@olearyj234 的评论/答案,了解解决 beta01 及更高版本问题的正确方法。

--

似乎 alpha04 存在问题,恢复为 alpha03 可以解决问题。 估计我们得等到 alpha05 之后才能升级。

真希望 Google 等到生物识别库结束 alpha 之后再弃用指纹库……

【讨论】:

  • 说真的,他们甚至对此进行了烟雾测试吗?即使调用 BiometricPrompt.authenticate 的简单用例也会为我产生这个错误,它不像发生在一些奇怪的极端情况下。让我觉得他们甚至没有对此进行质量检查。 Alpha3 也充满了令人尴尬的错误。从事此工作的人应该被解雇。
  • beta-01 似乎还是有同样的问题。
  • beta01 解决了这个问题,对代码进行了微小的更改,请参阅我的回答
  • @olearyj234 你是对的,我可以确认使用 beta01 中引入的第二个构造函数解决了这个问题
【解决方案3】:

最新版本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)
    }

【讨论】:

  • 请看我的回答,这个问题已经在 beta01 中修复了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多