Android 10及以下版本仅展示设备凭证认证提示的实现方案咨询
适配方案
直接按系统版本分路处理即可,覆盖绝大多数场景:
版本分路实现逻辑
- Android 11(API 30)及以上:直接用你当前使用的biometric库原生能力,设置
setAllowedAuthenticators(DEVICE_CREDENTIAL)即可,官方原生支持仅展示设备凭证选项,不会触发生物识别。 - Android 10(API 29)及以下:借助KeyguardManager的隐藏参数实现,该参数在原生ROM和绝大多数国产定制ROM中都可正常生效,强制禁用生物识别选项,仅展示PIN/图案/密码输入界面。
对应实现代码示例:
// 设备凭证验证请求码,自行定义 val REQUEST_CODE_CREDENTIAL = 1001 when { Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { val promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("验证设备凭证") .setSubtitle("请输入设备PIN/图案/密码完成验证") .setConfirmationRequired(false) .setAllowedAuthenticators(DEVICE_CREDENTIAL) .build() biometricPrompt.authenticate(promptInfo) } else -> { val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager val credentialIntent = keyguardManager.createConfirmDeviceCredentialIntent( "验证设备凭证", "请输入设备PIN/图案/密码完成验证" ) // 追加隐藏参数,强制关闭生物识别选项 credentialIntent?.putExtra("com.android.server.locksettings.LOCKSCREEN_BIOMETRIC_DISABLED", true) if (credentialIntent != null) { startActivityForResult(credentialIntent, REQUEST_CODE_CREDENTIAL) } else { // 设备未设置任何密码的兜底逻辑,自行实现 } } } // 后续在onActivityResult中接收验证结果即可 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == REQUEST_CODE_CREDENTIAL) { if (resultCode == Activity.RESULT_OK) { // 验证通过逻辑 } else { // 验证失败/用户取消逻辑 } } }
极端兼容兜底方案
如果遇到极个别定制ROM不识别上述隐藏参数,可以采用临时禁用应用生物识别权限的方案:
- 调用验证前,先主动取消应用的生物识别权限
- 此时系统验证界面会自动 fallback 到仅展示设备凭证选项
- 验证流程结束后,根据业务需要决定是否引导用户重新授予生物识别权限
内容的提问来源于stack exchange,提问作者sneharc
相关产品推荐
相关产品推荐

