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

Android应用Google Sign-In始终失败,求解决方案

解决Google Sign-In登录失败并关联Firebase认证的问题

1. 升级依赖库版本

你当前使用的play-services-auth:17.0.0是4年前的旧版本,存在兼容性问题(与新Android系统、Firebase版本不匹配)。建议升级到最新稳定版,同时同步更新Firebase Auth依赖:

implementation 'com.google.android.gms:play-services-auth:20.7.0'
implementation 'com.google.firebase:firebase-auth:22.3.1'

(注:版本号可根据Google Maven仓库的最新稳定版调整)

2. 验证Web Client ID配置

requestIdToken需要的是Web类型的Client ID,而非Android Client ID:

  • 从Firebase控制台下载最新的google-services.json文件,替换项目中的对应文件;
  • 或直接在Firebase控制台「认证→登录方法→Google」中,复制Web SDK配置里的Client ID,粘贴到项目strings.xml的default_web_client_id字段中。

3. 重构代码适配新版Google Sign-In API

旧的GoogleApiClient已被弃用,改用GoogleSignInClient简化流程,同时避免旧API的潜在问题:

初始化代码

private GoogleSignInClient mGoogleSignInClient;
private FirebaseAuth firebaseAuth;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_enter);

    firebaseAuth = FirebaseAuth.getInstance();

    // 配置Google登录选项
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestIdToken(getString(R.string.default_web_client_id))
            .requestEmail()
            .build();

    // 创建GoogleSignInClient实例
    mGoogleSignInClient = GoogleSignIn.getClient(this, gso);

    // 登录按钮点击事件
    sign_in_button.setOnClickListener(v -> startGoogleSignIn());
}

private void startGoogleSignIn() {
    Intent signInIntent = mGoogleSignInClient.getSignInIntent();
    startActivityForResult(signInIntent, RC_SIGN_IN);
}

处理登录结果

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == RC_SIGN_IN) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            // 获取登录成功后的账户信息
            GoogleSignInAccount account = task.getResult(ApiException.class);
            // 关联Firebase认证
            firebaseAuthWithGoogle(account);
        } catch (ApiException e) {
            // 打印错误状态码,便于排查问题
            Log.e("GoogleSignInError", "登录失败,状态码:" + e.getStatusCode());
            Toast.makeText(this, "登录失败", Toast.LENGTH_SHORT).show();
        }
    }
}

private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
    AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
    firebaseAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, task -> {
                if (task.isSuccessful()) {
                    // 登录成功,跳转主页面
                    Intent intent = new Intent(this, MainActivity.class);
                    startActivity(intent);
                    finish();
                } else {
                    Toast.makeText(this, "Firebase认证失败", Toast.LENGTH_SHORT).show();
                }
            });
}

注:如果你的项目使用AndroidX,推荐使用Activity Result API替代已弃用的startActivityForResult,进一步优化代码稳定性。

4. 检查Firebase控制台配置

  • 确保「认证→登录方法→Google」已启用;
  • 检查项目设置中是否添加了正确的SHA-1指纹(debug和release版本都需要):
    debug版SHA-1可通过命令获取:
    keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android
    

5. 排查错误详情

通过ApiException的状态码定位问题,常见状态码对应原因:

  • 12500:Client ID配置错误、SHA-1未添加、网络连接异常;
  • 10:Google Sign-In API未在Google Cloud Console启用;
  • 7:设备Google Play Services版本过低或未安装。

内容的提问来源于stack exchange,提问作者Berkay Isıkoglu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:12:20