Firebase登录异常:虚假邮箱登录崩溃,Google邮箱正常问题排查
问题解决方案
1. 修复空指针异常(NullPointerException)
直接调用currentUserName.equals(users.getUserName())会在currentUserName为空时触发崩溃,反过来用非空的对象调用equals,或者先判空:
// 方案1:优先用数据库返回的用户名调用equals,避免空指针 if (users.getUserName() != null && users.getUserName().equals(currentUserName)) { continue; // 跳过当前用户 } // 方案2:先判断currentUserName是否非空 if (currentUserName != null && currentUserName.equals(users.getUserName())) { continue; }
2. 统一用户ID对比逻辑,修复userId为null的问题
问题根源
部分用户的users.getUserId()返回null,是因为注册流程中没有把Firebase Auth生成的uid写入数据库的用户记录。不管是Google登录还是邮箱注册,都必须确保将Auth的uid存入userId字段。
修复步骤
- 完善注册/登录流程:用户注册或登录成功后,获取Auth的
uid并写入数据库:
// 获取当前登录用户的Auth ID String currentUid = FirebaseAuth.getInstance().getCurrentUser().getUid(); // 构建用户对象时传入uid User user = new User(currentUid, userName, userEmail, userAvatar); // 写入数据库(用uid作为节点key,避免重复) databaseReference.child("users").child(currentUid).setValue(user);
- 优化用户过滤逻辑:用Auth获取的
currentUid(必然非空)对比数据库用户的userId,同时处理旧数据中userId为null的情况:
String currentUid = FirebaseAuth.getInstance().getCurrentUser().getUid(); // 遍历用户列表时过滤当前用户 if (users.getUserId() != null && users.getUserId().equals(currentUid)) { continue; } // 对userId为null的旧数据,可直接过滤或后续补全字段
3. 处理数据库缺失字段(如虚假账号无头像)
在用户模型类中给可选字段设置默认值,避免读取时返回null:
public class User { private String userId; private String userName; private String email; private String avatarUrl; // Firebase需要的无参构造 public User() {} public User(String userId, String userName, String email, String avatarUrl) { this.userId = userId; this.userName = userName; this.email = email; // 头像字段为空时设为默认空字符串 this.avatarUrl = avatarUrl != null ? avatarUrl : ""; } // Getter方法中处理null public String getAvatarUrl() { return avatarUrl != null ? avatarUrl : ""; } // 其他Getter、Setter方法 }
4. 确保当前用户信息正确获取
登录成功后,优先从Firebase Auth取基础信息,缺失时再从数据库同步:
FirebaseUser authUser = FirebaseAuth.getInstance().getCurrentUser(); if (authUser != null) { String currentUserName = authUser.getDisplayName(); // Google登录有displayName,邮箱注册可能需要从数据库读取 if (currentUserName == null || currentUserName.isEmpty()) { databaseReference.child("users").child(authUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { User currentUser = snapshot.getValue(User.class); if (currentUser != null) { currentUserName = currentUser.getUserName(); // 更新全局变量或UI } } @Override public void onCancelled(@NonNull DatabaseError error) { // 处理数据库读取错误 } }); } }
内容的提问来源于stack exchange,提问作者Sarmad Ali
相关产品推荐
相关产品推荐

