微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

BiometricPrompt 在旋转/onCreate 时使应用程序崩溃

如何解决BiometricPrompt 在旋转/onCreate 时使应用程序崩溃

我想在应用启动后立即使用生物识别(指纹)登录。 该应用程序使用托管活动并使用生物识别 (androidx.biometric:biometric:1.2.0-alpha03) 加载登录片段。关于登录的一切工作正常,但一旦手机旋转它就会崩溃。从日志文件中,我了解到崩溃发生在 onCreate 内部,因为它尝试使用空构造函数重新创建 FingerprintDialogFragment。 我试图取消 onPause 函数中的身份验证并手动重新创建它,但这无济于事。到目前为止,我在片段中的代码如下所示:

override fun onResume() {
    super.onResume()
    if(loginSharedPreferences.getBoolean(BIOMETRIC_SET,false)) {
        setupBiometricPrompt()
        biometricPrompt?.authenticate(promptInfo)
    }
}

override fun onPause() {
    if(biometricPrompt != null) {
        biometricPrompt!!.cancelAuthentication()
        biometricPrompt = null
    }
    super.onPause()
}
private fun setupBiometricPrompt() {
    promptInfo = createBiometricPromptInfo()

    executor = ContextCompat.getMainExecutor(requireContext())
    biometricPrompt = BiometricPrompt(this,executor,object : BiometricPrompt.AuthenticationCallback() {
            override fun onAuthenticationError(errorCode: Int,errString: CharSequence) {
                super.onAuthenticationError(errorCode,errString)
                Log.d(TAG,"Authentication error: $errString")
            }

            override fun onAuthenticationSucceeded(
                result: BiometricPrompt.AuthenticationResult) {
                super.onAuthenticationSucceeded(result)
                Log.d(TAG,"Authentication succeeded!")
                callbacks?.loginSuccessful()
            }

            override fun onAuthenticationFailed() {
                super.onAuthenticationFailed()
                Log.d(TAG,"Authentication Failed!")
            }
        })
}
private fun createBiometricPromptInfo(): BiometricPrompt.PromptInfo {
    return BiometricPrompt.PromptInfo.Builder()
        .setTitle(resources.getString(R.string.biometric_title))
        .setSubtitle(resources.getString(R.string.biometric_subtitle))
        .setNegativeButtonText(resources.getString(R.string.biometric_cancel))
        .setAllowedAuthenticators(BIOMETRIC_STRONG)
        .build()
}

和日志文件

java.lang.RuntimeException: Unable to start activity: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment androidx.biometric.FingerprintDialogFragment: Could not find Fragment constructor
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3114)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257)
at android.app.ActivityThread.handlerelaunchActivityInner(ActivityThread.java:5039)
at android.app.ActivityThread.handlerelaunchActivity(ActivityThread.java:4948)
at android.app.servertransaction.ActivityrelaunchItem.execute(ActivityrelaunchItem.java:69)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7050)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
Caused by: androidx.fragment.app.Fragment$InstantiationException: Unable to instantiate fragment androidx.biometric.FingerprintDialogFragment: Could not find Fragment constructor
at androidx.fragment.app.Fragment.instantiate(Fragment.java:628)
at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57)
at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:483)
at androidx.fragment.app.FragmentStateManager.<init>(FragmentStateManager.java:85)
at androidx.fragment.app.FragmentManager.restoreSaveState(FragmentManager.java:2728)
at androidx.fragment.app.Fragment.restoreChildFragmentState(Fragment.java:1890)
at androidx.fragment.app.Fragment.onCreate(Fragment.java:1867)
at com.tetraguard.android.otp.LoginPinFragment.onCreate(LoginPinFragment.kt:59)
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949)
at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475)
at androidx.fragment.app.FragmentStateManager.movetoExpectedState(FragmentStateManager.java:278)
at androidx.fragment.app.FragmentStore.movetoExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:3061)
at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:240)
at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:276)
at com.tetraguard.android.otp.MainActivity.onCreate(MainActivity.kt:61)
at android.app.Activity.performCreate(Activity.java:7327)
at android.app.Activity.performCreate(Activity.java:7318)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3094)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257) 
at android.app.ActivityThread.handlerelaunchActivityInner(ActivityThread.java:5039) 
at android.app.ActivityThread.handlerelaunchActivity(ActivityThread.java:4948) 
at android.app.servertransaction.ActivityrelaunchItem.execute(ActivityrelaunchItem.java:69) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:214) 
at android.app.ActivityThread.main(ActivityThread.java:7050) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 
Caused by: java.lang.NoSuchMethodException: androidx.biometric.FingerprintDialogFragment.<init> []
at java.lang.class.getConstructor0(Class.java:2328)
at java.lang.class.getConstructor(Class.java:1725)
at androidx.fragment.app.Fragment.instantiate(Fragment.java:613)
at androidx.fragment.app.FragmentContainer.instantiate(FragmentContainer.java:57) 
at androidx.fragment.app.FragmentManager$3.instantiate(FragmentManager.java:483) 
at androidx.fragment.app.FragmentStateManager.<init>(FragmentStateManager.java:85) 
at androidx.fragment.app.FragmentManager.restoreSaveState(FragmentManager.java:2728) 
at androidx.fragment.app.Fragment.restoreChildFragmentState(Fragment.java:1890) 
at androidx.fragment.app.Fragment.onCreate(Fragment.java:1867) 
at com.tetraguard.android.otp.LoginPinFragment.onCreate(LoginPinFragment.kt:59) 
at androidx.fragment.app.Fragment.performCreate(Fragment.java:2949) 
at androidx.fragment.app.FragmentStateManager.create(FragmentStateManager.java:475) 
at androidx.fragment.app.FragmentStateManager.movetoExpectedState(FragmentStateManager.java:278) 
at androidx.fragment.app.FragmentStore.movetoExpectedState(FragmentStore.java:112) 
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1647) 
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128) 
at androidx.fragment.app.FragmentManager.dispatchCreate(FragmentManager.java:3061) 
at androidx.fragment.app.FragmentController.dispatchCreate(FragmentController.java:240) 
at androidx.fragment.app.FragmentActivity.onCreate(FragmentActivity.java:276) 
at com.tetraguard.android.otp.MainActivity.onCreate(MainActivity.kt:61) 
at android.app.Activity.performCreate(Activity.java:7327) 
at android.app.Activity.performCreate(Activity.java:7318) 
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271) 
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:3094) 
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3257) 
at android.app.ActivityThread.handlerelaunchActivityInner(ActivityThread.java:5039) 
at android.app.ActivityThread.handlerelaunchActivity(ActivityThread.java:4948) 
at android.app.servertransaction.ActivityrelaunchItem.execute(ActivityrelaunchItem.java:69) 
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:214) 
at android.app.ActivityThread.main(ActivityThread.java:7050) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。