Android Google登录如何判断新用户并执行对应操作
如何判断Google登录用户是否为新用户并展示额外View
我已经完成了Android端的Google登录功能,现在需要新增逻辑判断登录用户是新用户还是已有用户,若是新用户则展示额外的View。以下是我当前的Google登录代码:
import androidx.annotation.NonNonNull; import androidx.appcompat.app.AppCompatActivity; import android.app.ProgressDialog; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.Toast; 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.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; import java.util.Objects; public class Login extends AppCompatActivity { private static final int RC_SIGN_IN = 100; LinearLayout button; GoogleSignInClient mGoogleSignInClient; GoogleSignInAccount account; DatabaseReference databaseReference; ProgressDialog progressDialog; long childTotal = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); button = findViewById(R.id.loginBtn); getWindow().setStatusBarColor(getResources().getColor(R.color.white)); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build(); mGoogleSignInClient = GoogleSignIn.getClient(Login.this, gso); databaseReference = FirebaseDatabase.getInstance().getReference().child("Users"); databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { childTotal = snapshot.getChildrenCount(); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { progressDialog = new ProgressDialog(Login.this); progressDialog.setMessage("Please wait . . . "); progressDialog.setCancelable(false); progressDialog.show(); signIn(); } }); } private void signIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); handleSignInResult(task); } } private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { account = completedTask.getResult(ApiException.class); if (account!=null){ addUserDataToDatabase(); startActivity(new Intent(Login.this, MainActivity.class)); progressDialog.dismiss(); finish(); } } catch (ApiException e) { progressDialog.dismiss(); } } @Override protected void onStart() { super.onStart(); account = GoogleSignIn.getLastSignedInAccount(this); if (account!=null) { startActivity(new Intent(this, MainActivity.class)); finish(); } } private void addUserDataToDatabase(){ UserModel userModel = new UserModel(); userModel.setName(account.getDisplayName()); userModel.setEmail(account.getEmail()); if (account.getPhotoUrl()==null){ userModel.setPicture("No image available"); }else { userModel.setPicture(String.valueOf(account.getPhotoUrl())); } databaseReference.child(Objects.requireNonNull(account.getDisplayName())) .setValue(userModel); } }
解决方案
核心逻辑
判断新用户的关键是用Google用户的唯一ID作为数据库查询依据(昵称displayName可能重复,无法保证唯一性),步骤如下:
- 登录成功后,通过Google用户ID查询Firebase数据库
- 若查询结果为空,判定为新用户,执行添加数据+展示额外View的逻辑
- 若查询结果存在,判定为老用户,直接进入主页面
修改后的代码调整
1. 重写handleSignInResult方法
替换原有直接添加数据的逻辑,先做用户存在性检查:
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { account = completedTask.getResult(ApiException.class); if (account != null) { // 使用Google用户的唯一ID作为数据库节点标识 final String userId = account.getId(); databaseReference.child(userId).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { // 老用户:直接进入主页面 startActivity(new Intent(Login.this, MainActivity.class)); } else { // 新用户:添加数据后跳转到带额外View的页面 addUserDataToDatabase(userId); // 这里假设NewUserActivity是你用来展示额外View的页面 startActivity(new Intent(Login.this, NewUserActivity.class)); } progressDialog.dismiss(); finish(); } @Override public void onCancelled(@NonNull DatabaseError error) { progressDialog.dismiss(); Toast.makeText(Login.this, "数据库查询失败", Toast.LENGTH_SHORT).show(); } }); } } catch (ApiException e) { progressDialog.dismiss(); Toast.makeText(this, "登录失败:" + e.getMessage(), Toast.LENGTH_SHORT).show(); } }
2. 修改addUserDataToDatabase方法
接收用户ID参数,用其作为数据库节点的key:
private void addUserDataToDatabase(String userId){ UserModel userModel = new UserModel(); userModel.setName(account.getDisplayName()); userModel.setEmail(account.getEmail()); if (account.getPhotoUrl() == null){ userModel.setPicture("No image available"); }else { userModel.setPicture(String.valueOf(account.getPhotoUrl())); } databaseReference.child(userId).setValue(userModel); }
3. 删除无用代码
原代码中监听用户总数的childTotal逻辑对判断新用户无帮助,直接删除:
// 删除这段代码 databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { childTotal = snapshot.getChildrenCount(); } @Override public void onCancelled(@NonNull DatabaseError error) { } });
补充说明
- 你需要自行创建
NewUserActivity来实现额外View的展示,或者在MainActivity中通过Intent传递参数(如intent.putExtra("isNewUser", true)),在主页面内控制额外View的显示/隐藏。 - 确保
UserModel类的字段与数据库存储的字段完全匹配,避免序列化异常。
内容的提问来源于stack exchange,提问作者prabin chand
相关产品推荐
相关产品推荐

