You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 01:30:03