Android 将 androidx 生物识别更新为 1.0.0-alpha04 后崩溃
Android crashed after updating androidx biometric to 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
谢谢!
编辑:问题似乎已解决,请参阅@olearyj234 的 comment/answer 以了解解决 beta01 和更新版本问题的正确方法。
--
alpha04 似乎有问题,恢复到 alpha03 可以解决问题。
猜猜我们必须等待 alpha05 才能升级。
真希望 Google 在弃用指纹库之前等到生物识别库已经过 alpha 版...
问题在最新版本androidx.biometric:biometric:1.0.0-beta01
中仍然存在。
修复它是显示来自处理程序的生物识别提示:
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)
}
问题已在 androidx.biometric:biometric:1.0.0-beta01
中通过提供第二个构造函数得到解决。在此版本之前,我通过恢复 alpha03
解决了这个问题,但现在有一个实际的解决方案可用。
您可以找到 beta01
发行说明 here
We’ve introduced a second constructor for BiometricPrompt that allows
it to be hosted in a Fragment (as opposed to the existing constructor,
which requires a FragmentActivity).
您可以找到新的 BiometricPrompt
构造函数文档 here
BiometricPrompt(Fragment fragment, Executor executor, BiometricPrompt.AuthenticationCallback callback)
要修复,请按照简单的步骤操作:
- 将您的 build.gradle 更改为使用生物识别版本
1.0.0-beta01
使用新的构造函数。简而言之,将第一个参数更改为您的片段而不是 activity。请参阅下面我的代码更改:
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-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
谢谢!
编辑:问题似乎已解决,请参阅@olearyj234 的 comment/answer 以了解解决 beta01 和更新版本问题的正确方法。
--
alpha04 似乎有问题,恢复到 alpha03 可以解决问题。 猜猜我们必须等待 alpha05 才能升级。
真希望 Google 在弃用指纹库之前等到生物识别库已经过 alpha 版...
问题在最新版本androidx.biometric:biometric:1.0.0-beta01
中仍然存在。
修复它是显示来自处理程序的生物识别提示:
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)
}
问题已在 androidx.biometric:biometric:1.0.0-beta01
中通过提供第二个构造函数得到解决。在此版本之前,我通过恢复 alpha03
解决了这个问题,但现在有一个实际的解决方案可用。
您可以找到 beta01
发行说明 here
We’ve introduced a second constructor for BiometricPrompt that allows it to be hosted in a Fragment (as opposed to the existing constructor, which requires a FragmentActivity).
您可以找到新的 BiometricPrompt
构造函数文档 here
BiometricPrompt(Fragment fragment, Executor executor, BiometricPrompt.AuthenticationCallback callback)
要修复,请按照简单的步骤操作:
- 将您的 build.gradle 更改为使用生物识别版本
1.0.0-beta01
使用新的构造函数。简而言之,将第一个参数更改为您的片段而不是 activity。请参阅下面我的代码更改:
val biometricPrompt = BiometricPrompt(activity!!, executor, callback) // Change the above line to the below line val biometricPrompt = BiometricPrompt(this, executor, callback)