Android 使用BiometricPrompt实现生物登录时屏幕旋转导致应用崩溃问题
问题根因
- 你使用的
androidx.biometric:biometric:1.2.0-alpha03为测试版本,存在已知缺陷:库内部的FingerprintDialogFragment未公开无参构造方法,当屏幕旋转等配置变更触发Activity/Fragment销毁重建时,系统会尝试通过反射调用无参构造恢复该DialogFragment实例,找不到对应构造方法就会抛出崩溃。 - 你之前在
onPause中取消验证的逻辑时机过晚:onSaveInstanceState(系统保存Fragment状态的回调)执行顺序早于onPause,你执行取消操作时,系统已经把FingerprintDialogFragment的状态存入了FragmentManager的恢复栈中,重建时依然会尝试恢复该无效实例。
解决方案
方案1(优先推荐):升级生物识别依赖版本
该bug已在后续稳定版修复,直接将依赖替换为正式版即可:
implementation 'androidx.biometric:biometric:1.2.0' // 也可使用更高的稳定版本
方案2:修改配置变更处理逻辑
如果暂时无法升级依赖,可以在AndroidManifest.xml中对应宿主Activity节点添加配置变更声明,避免旋转时销毁重建页面:
<activity android:name=".otp.MainActivity" android:configChanges="orientation|screenSize|screenLayout|keyboardHidden" />
方案3:调整验证取消时机
如果不允许修改Activity的configChanges属性,将取消验证的逻辑移到onSaveInstanceState回调中,在系统保存状态前就销毁生物识别弹窗,避免存入无效状态:
override fun onSaveInstanceState(outState: Bundle) { // 先取消验证再保存状态 biometricPrompt?.cancelAuthentication() biometricPrompt = null super.onSaveInstanceState(outState) }
同时调整onResume中的验证调用逻辑,避免在状态已保存的场景下调用弹窗出现额外异常:
override fun onResume() { super.onResume() val isBiometricEnabled = loginSharedPreferences.getBoolean(BIOMETRIC_SET, false) if(isBiometricEnabled && !isStateSaved) { setupBiometricPrompt() biometricPrompt?.authenticate(promptInfo) } } // 原有onPause中的取消逻辑可以直接删除
内容的提问来源于stack exchange,提问作者Tignite
相关产品推荐
相关产品推荐

