Android Smart Lock多凭据请求时如何强制显示成功横幅?
如何在请求多个Android Smart Lock凭据时强制显示成功横幅?
没错,你观察到的现象完全正确:当Smart Lock自动匹配到单个凭据并返回时,系统会自动弹出那个蓝色的成功横幅;但当需要用户手动从多个凭据中选择其一的场景下,登录成功后默认不会显示这个横幅。不过别担心,我们可以通过手动调用官方API来强制触发它。
问题根源
当进入CommonStatusCodes.RESOLUTION_REQUIRED分支时,整个流程是用户主动参与的凭据选择交互,系统默认认为开发者会自行处理登录成功后的反馈逻辑,所以不会自动触发横幅。但官方贴心提供了手动显示横幅的方法,刚好能解决这个需求。
解决方案代码示例
我们需要用ActivityResultContracts来处理凭据选择的Intent结果(替代旧版的onActivityResult),然后在登录成功后手动调用showCredentialPickerSuccess方法:
1. 先定义ActivityResultLauncher
在你的Activity或Fragment中注册一个用于启动凭据选择界面的启动器:
private val credentialSelectionLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK) { result.data?.let { data -> // 获取用户选中的凭据 val selectedCredential = Credential.getFromIntent(data) selectedCredential?.let { credential -> // 执行你的登录逻辑 logInWithCredential(credential) // 手动触发成功横幅 Credentials.getClient(this) .showCredentialPickerSuccess(credential) .addOnCompleteListener { showTask -> if (!showTask.isSuccessful) { // 可选:记录横幅显示失败的日志 Log.e("SmartLock", "Failed to show success banner: ${showTask.exception}") } } } } } }
2. 修改原请求逻辑
更新你原本的凭据请求代码,在处理RESOLUTION_REQUIRED时启动上面定义的launcher:
Credentials.getClient(context) .request(credentialRequest) .addOnCompleteListener { task -> if (task.isSuccessful) { // 单个凭据自动返回的情况,系统会自动显示横幅 task.result?.credential?.let { credential -> logInWithCredential(credential) } return@addOnCompleteListener } // 处理需要用户选择凭据的情况 val exception = task.exception if (exception is ResolvableApiException && exception.statusCode == CommonStatusCodes.RESOLUTION_REQUIRED) { // 启动凭据选择界面 credentialSelectionLauncher.launch(exception.intent) } else { // 处理其他错误情况 Log.e("SmartLock", "Credential request failed: ${exception?.message}") } }
注意事项
- 确保你使用的是最新版本的AndroidX Credentials库(建议
androidx.credentials:credentials:1.2.0及以上) - 调用
showCredentialPickerSuccess时,务必使用Activity/Fragment的上下文,不要用Application上下文,否则可能会显示失败 - 少数情况下横幅可能无法显示(比如系统设置中关闭了Smart Lock相关功能),可以在
addOnCompleteListener中处理失败逻辑
内容的提问来源于stack exchange,提问作者wdina
相关产品推荐
相关产品推荐

