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

Android Studio中Firebase实时数据库实现登录账号类型校验与跳转

嘿,我来帮你搞定这个需求!根据你的描述,咱们可以通过Firebase Auth登录后,查询实时数据库里的用户类型来实现跳转。下面分步骤给你讲清楚,附完整代码示例:

一、先明确合理的数据库结构(假设)

因为你没给出具体的数据库结构,我先假设一个最常用的结构,你可以根据自己的实际情况调整:

{
  "users": {
    "user1%40example%2Ecom": {  // 这里是编码后的邮箱:user1@example.com
      "email": "user1@example.com",
      "userType": "User Regular",
      "username": "普通用户1"
    },
    "business1%40example%2Ecom": {  // 编码后的邮箱:business1@example.com
      "email": "business1@example.com",
      "userType": "User Business",
      "shopName": "商家店铺1"
    }
  }
}

或者你也可以用Firebase Auth的UID作为用户节点的键,这种情况下需要通过email字段做查询(后面会给出对应的代码)。

二、核心代码实现

1. 登录验证(Firebase Auth)

先完成用户的邮箱密码登录,登录成功后再去查询用户类型:

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;

public class LoginActivity extends AppCompatActivity {

    private EditText emailEditText, passwordEditText;
    private Button loginButton;
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        // 初始化控件和Firebase Auth
        emailEditText = findViewById(R.id.et_email);
        passwordEditText = findViewById(R.id.et_password);
        loginButton = findViewById(R.id.btn_login);
        mAuth = FirebaseAuth.getInstance();

        // 登录按钮点击事件
        loginButton.setOnClickListener(v -> {
            String email = emailEditText.getText().toString().trim();
            String password = passwordEditText.getText().toString().trim();

            // 输入校验
            if (TextUtils.isEmpty(email) || TextUtils.isEmpty(password)) {
                Toast.makeText(LoginActivity.this, "请完整填写邮箱和密码", Toast.LENGTH_SHORT).show();
                return;
            }

            // 调用Firebase Auth完成登录
            mAuth.signInWithEmailAndPassword(email, password)
                    .addOnCompleteListener(task -> {
                        if (task.isSuccessful()) {
                            // 登录成功,去查询用户类型
                            checkUserType(email);
                        } else {
                            // 登录失败,提示错误信息
                            Toast.makeText(LoginActivity.this, "登录失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
                        }
                    });
        });
    }

2. 查询用户类型并跳转

接下来实现checkUserType方法,这里分两种数据库结构的情况:

方案1:用编码后的邮箱作为用户节点键

private void checkUserType(String email) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference usersRef = database.getReference("users");

        // 处理邮箱里的特殊字符(Firebase不允许节点键包含.和@)
        String encodedEmail = email.replace(".", "%2E").replace("@", "%40");

        // 单次查询用户数据
        usersRef.child(encodedEmail).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                if (snapshot.exists()) {
                    // 获取用户类型
                    String userType = snapshot.child("userType").getValue(String.class);
                    if (userType != null) {
                        // 根据类型跳转对应首页
                        if (userType.equals("User Business")) {
                            startActivity(new Intent(LoginActivity.this, BusinessHomeActivity.class));
                        } else if (userType.equals("User Regular")) {
                            startActivity(new Intent(LoginActivity.this, RegularHomeActivity.class));
                        } else {
                            Toast.makeText(LoginActivity.this, "未知用户类型", Toast.LENGTH_SHORT).show();
                        }
                    }
                } else {
                    Toast.makeText(LoginActivity.this, "未找到该用户的信息", Toast.LENGTH_SHORT).show();
                }
                // 关闭当前登录页
                finish();
            }

            @Override
            public void onCancelled(DatabaseError error) {
                Toast.makeText(LoginActivity.this, "查询失败:" + error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}

方案2:用UID作为用户节点键(按email字段查询)

如果你的数据库是用UID作为节点键,比如:

{
  "users": {
    "abc123XYZ": {
      "email": "user1@example.com",
      "userType": "User Regular",
      "uid": "abc123XYZ"
    }
  }
}

那把checkUserType换成下面的代码即可:

private void checkUserType(String email) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference usersRef = database.getReference("users");

        // 按email字段查询匹配的用户
        usersRef.orderByChild("email").equalTo(email).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                if (!snapshot.getChildren().isEmpty()) {
                    // 遍历查询结果(理论上只有一个用户)
                    for (DataSnapshot userSnapshot : snapshot.getChildren()) {
                        String userType = userSnapshot.child("userType").getValue(String.class);
                        if (userType != null) {
                            if (userType.equals("User Business")) {
                                startActivity(new Intent(LoginActivity.this, BusinessHomeActivity.class));
                            } else if (userType.equals("User Regular")) {
                                startActivity(new Intent(LoginActivity.this, RegularHomeActivity.class));
                            } else {
                                Toast.makeText(LoginActivity.this, "未知用户类型", Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                } else {
                    Toast.makeText(LoginActivity.this, "未找到该用户的信息", Toast.LENGTH_SHORT).show();
                }
                finish();
            }

            @Override
            public void onCancelled(DatabaseError error) {
                Toast.makeText(LoginActivity.this, "查询失败:" + error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    }
}
三、重要注意事项
  • 数据库权限设置:一定要确保你的Firebase数据库规则允许已登录用户读取自己的信息,否则会出现权限拒绝错误。比如可以设置这样的规则:
{
  "rules": {
    "users": {
      "$userId": {
        ".read": "auth != null && auth.uid === $userId",
        ".write": "auth != null && auth.uid === $userId"
      }
    }
  }
}

如果是用邮箱作为节点键,规则可以调整为:

{
  "rules": {
    "users": {
      "$encodedEmail": {
        ".read": "auth != null && auth.email.replace('.', '%2E').replace('@', '%40') === $encodedEmail",
        ".write": "auth != null && auth.email.replace('.', '%2E').replace('@', '%40') === $encodedEmail"
      }
    }
  }
}
  • 实体类优化:如果用户信息字段较多,可以创建一个User实体类,用snapshot.getValue(User.class)直接解析数据,代码会更整洁。
  • 异常处理:代码里已经处理了登录失败、查询失败、用户不存在等情况,记得给用户友好的提示。

内容的提问来源于stack exchange,提问作者Aamer Salame

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 21:17:55