Android 13无屏幕锁时调用Passkey API验证异常问题咨询
解决Android 13未设置屏幕锁时Passkey验证抛出GetCredentialCancellationException的问题
异常信息
GetCredentialException: activity is cancelled by the user.
androidx.credentials.exceptions.GetCredentialCancellationException: activity is cancelled by the user.
问题原因
Android 13及以上版本中,Passkey的身份验证流程依赖设备的屏幕锁(PIN、图案、指纹等)完成安全校验。当设备未设置任何屏幕锁时,系统无法完成必要的身份验证环节,直接终止Passkey验证流程,抛出该取消异常。
解决办法
1. 提前检测设备屏幕锁状态
在调用Passkey API前,先通过KeyguardManager检查设备是否已设置安全锁,若未设置则引导用户前往设置页面配置:
val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager if (!keyguardManager.isDeviceSecure) { Toast.makeText(this, "请先设置屏幕锁以使用Passkey验证", Toast.LENGTH_SHORT).show() startActivity(Intent(Settings.ACTION_SECURITY_SETTINGS)) return } // 后续执行Passkey验证逻辑
2. 捕获异常并针对性处理
在调用Passkey API的代码块中捕获GetCredentialCancellationException,区分是用户主动取消还是因无屏幕锁导致的流程终止:
try { val credentialManager = CredentialManager.create(this) val request = GetCredentialRequest.Builder() .addCredentialOption(GetPasskeyOption()) .build() val result = credentialManager.getCredential(this, request) // 处理Passkey验证成功逻辑 } catch (cancellationEx: GetCredentialCancellationException) { val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager if (!keyguardManager.isDeviceSecure) { Toast.makeText(this, "未设置屏幕锁无法完成验证,请先配置屏幕锁", Toast.LENGTH_SHORT).show() startActivity(Intent(Settings.ACTION_SECURITY_SETTINGS)) } else { // 用户主动取消验证的处理逻辑 Toast.makeText(this, "验证已取消", Toast.LENGTH_SHORT).show() } } catch (generalEx: GetCredentialException) { // 处理其他Passkey验证异常 Toast.makeText(this, "验证失败:${generalEx.message}", Toast.LENGTH_SHORT).show() }
关键说明
Android系统对Passkey的安全机制要求是硬性规则,无法绕过屏幕锁直接完成验证流程。必须确保设备配置了至少一种屏幕锁(PIN、图案、指纹、面部识别等),才能正常执行Passkey的验证流程。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

