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

Jetpack Credential Manager在三星S23 Ultra上无法正常工作

问题:Jetpack Credential Manager在三星S23 Ultra上调用getCredential无响应

我开发的Kotlin应用使用Jetpack Credential Manager API,在多款实体设备上测试认证功能正常,但在朋友的三星S23 Ultra(Android 14)上出现异常:调用getCredential后无任何反应,既不抛出异常也不返回结果,Logcat也没有相关日志。相同代码在其他Android 14设备上运行正常。

测试Activity代码如下:

class MainActivity : ComponentActivity() {
    private lateinit var credentialManager: CredentialManager;
    private val coroutineScope = CoroutineScope(Dispatchers.Main)

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        credentialManager = CredentialManager.create(this.baseContext)
        
        setContent {
            ...
            coroutineScope.launch {
                withContext(Dispatchers.Main) {
                    login("client_id")
                }
            }
        }
        
    }

    suspend fun login(serverClientId: String) {
        val requestBuilder = GetCredentialRequest.Builder()
        requestBuilder.addCredentialOption(
            GetGoogleIdOption.Builder().setFilterByAuthorizedAccounts(false)
                .setAutoSelectEnabled(false).setServerClientId(serverClientId).build()
        )
        requestBuilder.addCredentialOption(GetPasswordOption())
        try {
            val response = credentialManager.getCredential(this, requestBuilder.build())
            val credential = response.credential
        } catch (e: Throwable) {
            print(e.message)
        }
    }
}

可能的原因及修复方案

1. 协程上下文与作用域问题

你的代码存在两处协程使用不当的地方,这可能在三星设备的线程调度逻辑下触发静默阻塞:

  • 自定义CoroutineScope未绑定Activity生命周期,容易出现生命周期不一致问题;
  • 在Dispatchers.Main中嵌套调用withContext(Dispatchers.Main),并直接在主线程调用挂起函数getCredential,可能阻塞UI线程导致无响应。

修复代码:

class MainActivity : ComponentActivity() {
    private lateinit var credentialManager: CredentialManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        credentialManager = CredentialManager.create(this)
        
        setContent {
            ...
            // 使用lifecycleScope绑定Activity生命周期,避免内存泄漏
            lifecycleScope.launch {
                login("client_id")
            }
        }
        
    }

    suspend fun login(serverClientId: String) {
        val requestBuilder = GetCredentialRequest.Builder()
        requestBuilder.addCredentialOption(
            GetGoogleIdOption.Builder()
                .setFilterByAuthorizedAccounts(false)
                .setAutoSelectEnabled(false)
                .setServerClientId(serverClientId)
                .build()
        )
        requestBuilder.addCredentialOption(GetPasswordOption())
        
        try {
            // 切换到IO调度器调用挂起函数,避免阻塞主线程
            val response = withContext(Dispatchers.IO) {
                credentialManager.getCredential(this@MainActivity, requestBuilder.build())
            }
            val credential = response.credential
            // 这里添加凭证后续处理逻辑
        } catch (e: Throwable) {
            // 改用Log输出完整异常栈,原print无法在Logcat中显示
            Log.e("CredentialManager", "获取凭证失败", e)
        }
    }
}

2. 三星设备特定系统限制

三星S系列设备有自定义安全机制,需检查以下几点:

  • 确认设备已安装最新版Google Play服务(Credential Manager的Google ID认证依赖该服务);
  • 检查应用是否已声明INTERNET权限(Google ID认证需要网络请求);
  • 尝试清除应用存储缓存或卸载重装,避免三星缓存机制干扰;
  • 检查设备生物识别/安全设置,确认Credential Manager可访问系统凭证存储(部分三星设备有额外安全锁限制)。

3. 依赖版本兼容性

确保项目使用最新稳定版的Credential Manager依赖,老版本可能存在三星Android 14适配问题:

// 在Module的build.gradle.kts或build.gradle中更新依赖
dependencies {
    implementation("androidx.credentials:credentials:1.2.2")
    implementation("androidx.credentials:credentials-play-services-auth:1.2.2")
}

内容的提问来源于stack exchange,提问作者Nicolò Tagliaferro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:32:30