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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:34:04