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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:59:52