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
相关产品推荐
相关产品推荐

