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

Google SignIn API无响应:Android Compose集成问题求助

解决Android Compose中Google SignIn集成失败的问题

核心问题分析

  • 你当前使用的是Web类型的OAuth 2.0客户端ID,但Android应用需要创建专门的Android类型客户端ID,Web类型的client_secret对Android应用完全无效(Android作为公共客户端,不需要该参数)。
  • GoogleApiContract中requestIdToken("")传入空字符串,这会直接导致身份验证流程失败。

第一步:创建正确的Android客户端ID

  1. 打开Google Cloud控制台,进入项目的「API与服务」→「凭据」页面
  2. 删除现有Web类型客户端ID,点击「创建凭据」→「OAuth客户端ID」
  3. 选择「Android」类型,填写:
    • 应用包名:对应build.gradle(Module)中applicationId的值
    • SHA-1签名指纹:可通过Android Studio的「Gradle面板」→ 项目→ Tasks→ android→ signingReport获取
  4. 创建后会得到格式类似xxxxxx.apps.googleusercontent.com的Android客户端ID

第二步:修改GoogleApiContract代码

将空的requestIdToken替换为刚创建的Android客户端ID;如果仅需要获取用户邮箱、昵称等基础信息,甚至可以直接去掉requestIdToken配置:

class GoogleApiContract : ActivityResultContract<Int, Task<GoogleSignInAccount>?>(){
    override fun createIntent(context: Context, input: Int): Intent {
        // 替换为你的Android客户端ID
        val androidClientId = "你的Android客户端ID"
        val signInOptions = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(androidClientId) // 仅当需要ID Token时保留,否则可删除此行
            .requestEmail()
            .requestProfile()
            .build()

        val intent = GoogleSignIn.getClient(context, signInOptions)
        return intent.signInIntent
    }

    override fun parseResult(resultCode: Int, intent: Intent?): Task<GoogleSignInAccount>? {
        return when (resultCode) {
            Activity.RESULT_OK -> {
                GoogleSignIn.getSignedInAccountFromIntent(intent)
            }
            else -> null
        }
    }
}

第三步:其他关键检查点

  1. 依赖验证:确保build.gradle(Module)中添加了最新版Google Play服务依赖:
dependencies {
    implementation 'com.google.android.gms:play-services-auth:20.7.0' // 替换为最新版本
}
  1. 完善SignOut逻辑:避免缓存导致的登录状态异常,补充UserSessionViewModel的signOut方法:
fun signOut(context: Context){
    val googleSignInClient = GoogleSignIn.getClient(context, GoogleSignInOptions.DEFAULT_SIGN_IN)
    googleSignInClient.signOut().addOnCompleteListener {
        viewModelScope.launch {
            _user.value = null
        }
    }
}
  1. 错误排查:如果仍然报错,在回调中打印ApiException的状态码,根据代码定位问题(比如statusCode=12500表示客户端ID/签名指纹配置不匹配):
catch(e: ApiException){ 
    Log.d("App", "Google SignIn Error Code: ${e.statusCode}, Message: ${e.message}") 
}

额外说明

你下载的Web类型JSON配置文件对Android应用无作用,无需放入项目中。Android应用会通过客户端ID、包名、签名指纹与Google服务器完成验证。

内容的提问来源于stack exchange,提问作者Alix Blaine

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:50:25