Firebase Google登录选中账号后无法跳转至Main Activity问题排查
Firebase Google登录选中账号后无法跳转至MainActivity问题排查
问题描述
点击“Sign In With Google”按钮后,能显示可用Gmail账号列表,但选中账号后无法跳转至Main Activity。
已完成配置
- Firebase控制台已启用Google登录功能
- 已添加SHA-1和SHA-256指纹到Firebase项目
- app模块build.gradle配置:
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } }
错误日志提示
activityResume Trigger : not Whitelisted
相关代码
package com.turbotechnologies.quizgame import android.annotation.SuppressLint import android.content.Intent import android.graphics.Color import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.view.View import android.widget.TextView import android.widget.Toast import androidx.activity.result.ActivityResultCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import com.google.android.gms.auth.api.Auth import com.google.android.gms.auth.api.signin.GoogleSignIn import com.google.android.gms.auth.api.signin.GoogleSignInAccount import com.google.android.gms.auth.api.signin.GoogleSignInClient import com.google.android.gms.auth.api.signin.GoogleSignInOptions import com.google.android.gms.common.api.ApiException import com.google.android.gms.tasks.Task import com.google.firebase.auth.FirebaseAuth import com.google.firebase.auth.GoogleAuthCredential import com.google.firebase.auth.GoogleAuthProvider import com.turbotechnologies.quizgame.R.drawable import com.turbotechnologies.quizgame.databinding.ActivityLoginBinding class LoginActivity : AppCompatActivity() { lateinit var loginBinding: ActivityLoginBinding private val auth: FirebaseAuth = FirebaseAuth.getInstance() lateinit var googleSignInClient: GoogleSignInClient lateinit var activityResultLauncher: ActivityResultLauncher<Intent> @SuppressLint("SetTextI18n") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) loginBinding = ActivityLoginBinding.inflate(layoutInflater) val view = loginBinding.root setContentView(view) val textForGoogleSignInButton = loginBinding.buttonGoogleSignIn.getChildAt(0) as TextView textForGoogleSignInButton.text = "Continue with Google" textForGoogleSignInButton.setTextColor(Color.BLACK) textForGoogleSignInButton.textSize = 18F textForGoogleSignInButton.setBackgroundResource(drawable.button_shape) registeringActivityForGoogleSignIn() loginBinding.buttonGoogleSignIn.setOnClickListener { loginBinding.progressBar4.visibility = View.VISIBLE signInGoogle() } } private fun signInGoogle() { val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail().build() googleSignInClient = GoogleSignIn.getClient(ths,gso) signIn() } private fun signIn() { val signInIntent = googleSignInClient.signInIntent activityResultLauncher.launch(signInIntent) } private fun registeringActivityForGoogleSignIn() { activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult(), ActivityResultCallback { result -> val resultCode = result.resultCode val data = result.data if (resultCode == RESULT_OK && data != null) { val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(data) firebaseSignInWithGoogle(task) } }) } private fun firebaseSignInWithGoogle(task: Task<GoogleSignInAccount>) { try { val account: GoogleSignInAccount = task.getResult(ApiException::class.java) Toast.makeText( applicationContext, "Successfully logged in with Gmail account", Toast.LENGTH_SHORT ).show() val intent = Intent(this@LoginActivity, MainActivity::class.java) startActivity(intent) finish() firebaseGoogleAccount(account) } catch (e: ApiException) { Toast.makeText(applicationContext, e.localizedMessage, Toast.LENGTH_SHORT).show() } } private fun firebaseGoogleAccount(account: GoogleSignInAccount) { val authCredential = GoogleAuthProvider.getCredential( account.idToken, null ) auth.signInWithCredential(authCredential).addOnCompleteListener { task -> if (task.isSuccessful) { Toast.makeText(applicationContext,"Logged In",Toast.LENGTH_SHORT).show() } else { Toast.makeText(applicationContext,task.exception?.localizedMessage,Toast.LENGTH_SHORT).show() } } } }
问题排查与修复方案
1. 修复代码拼写错误
signInGoogle()方法中GoogleSignIn.getClient(ths,gso)存在拼写错误,ths应改为this,否则会导致GoogleSignInClient初始化失败,后续流程异常:
private fun signInGoogle() { val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail().build() googleSignInClient = GoogleSignIn.getClient(this,gso) signIn() }
2. 调整登录流程逻辑顺序
当前代码在未完成Firebase认证的情况下就跳转并销毁LoginActivity,会导致认证流程中断,且无法处理认证失败的情况。正确逻辑是完成Firebase认证后再跳转:
private fun firebaseSignInWithGoogle(task: Task<GoogleSignInAccount>) { try { val account: GoogleSignInAccount = task.getResult(ApiException::class.java) firebaseGoogleAccount(account) } catch (e: ApiException) { Toast.makeText(applicationContext, e.localizedMessage, Toast.LENGTH_SHORT).show() loginBinding.progressBar4.visibility = View.GONE } } private fun firebaseGoogleAccount(account: GoogleSignInAccount) { val authCredential = GoogleAuthProvider.getCredential(account.idToken, null) auth.signInWithCredential(authCredential).addOnCompleteListener { task -> loginBinding.progressBar4.visibility = View.GONE if (task.isSuccessful) { Toast.makeText(applicationContext,"Logged In",Toast.LENGTH_SHORT).show() val intent = Intent(this@LoginActivity, MainActivity::class.java) startActivity(intent) finish() } else { Toast.makeText(applicationContext,task.exception?.localizedMessage,Toast.LENGTH_SHORT).show() } } }
3. 处理“activityResume Trigger : not Whitelisted”提示
该提示与Google登录安全校验相关,可通过以下方式解决:
- 确认Firebase控制台中添加的SHA-1/SHA-256指纹与当前运行app的签名完全一致(区分debug和release版本)
- 重新下载
google-services.json文件并替换到app模块根目录 - 清除app缓存后重新测试
4. 补充异常处理的进度条隐藏
在登录失败的catch块中添加进度条隐藏逻辑,避免进度条一直显示。
内容的提问来源于stack exchange,提问作者Sai Pradeep Vamala
相关产品推荐
相关产品推荐

