Ошибка java.lang.IllegalStateException в BiometricPrompt.authenticate
Я использую androidx.biometric:biometric:1.0.0-alpha04
библиотека в моем проекте. Но я мог видеть много сбоев в крашлитике, а также в магазине игр, когда я пытаюсь аутентифицироваться с помощью BiometricPrompt. Сбой происходит при коде ниже
myBiometricPrompt.authenticate(promptInfo, mcryptoObject!!)
Ниже приведена трассировка стека от сбоев
Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.fragment.app.FragmentManagerImpl.checkStateLoss(FragmentManagerImpl.java:2080)
at androidx.fragment.app.FragmentManagerImpl.enqueueAction(FragmentManagerImpl.java:2106)
at androidx.fragment.app.BackStackRecord.commitInternal(BackStackRecord.java:683)
at androidx.fragment.app.BackStackRecord.commit(BackStackRecord.java:637)
at androidx.fragment.app.DialogFragment.show(DialogFragment.java:144)
at androidx.biometric.BiometricPrompt.authenticateInternal(BiometricPrompt.java:499)
at androidx.biometric.BiometricPrompt.authenticate(BiometricPrompt.java:452)
at com.transfast.transfast.biometric.BiometricHelper$startAuth$2.run(BiometricHelper.java:132)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:7000)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:441)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1408)
0 ответов
Мы обнаружили, что можем решить эту проблему, явно проверив, находится ли текущее действие в возобновленном состоянии:
FragmentActivity activity = ((FragmentActivity) activity);
Lifecycle lifecycle = activity.getLifecycle();
Lifecycle.State lifecycleState = lifecycle.getCurrentState();
if (lifecycleState != Lifecycle.State.RESUMED) {
// don't
return;
}
BiometricPrompt biometricPrompt = new BiometricPrompt(activity, mExecutor, callback);
biometricPrompt.authenticate(promptInfo);
должно быть RESUMED
в частности, потому что STARTED
все еще может разрешить вызов после onSaveInstanceState
См. https://developer.android.com/topic/libraries/architecture/lifecycle