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

使用PhoneAuthCredential登录后,如何校验用户信息并跳转对应页面?

解决方案:手机号验证后检查用户完整信息再跳转

这事儿好办!咱们只需要在手机号验证成功、登录完成后,加一步查询用户在Firebase数据库里的完整信息,判断是否存在用户名、邮箱这些必填字段,再决定跳转到主页还是补充注册页面。下面是修改后的完整代码和关键说明:

第一步:完善核心逻辑代码

首先,我们需要初始化Firebase数据库引用,然后在登录成功的回调里查询用户数据,判断字段是否完整:

public class VerifyPhoneActivity extends AppCompatActivity {
    private String verificationId;
    private FirebaseAuth mAuth;
    FirebaseAuth.AuthStateListener mAuthListener;
    DatabaseReference users; // 用户数据节点引用
    ProgressBar progressBar;
    TextInputEditText editText;
    AppCompatButton buttonSignIn;

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

        mAuth = FirebaseAuth.getInstance();
        // 初始化数据库引用,假设用户数据存在"users"节点下,用用户UID作为唯一标识
        users = FirebaseDatabase.getInstance().getReference("users");
        
        progressBar = findViewById(R.id.progressbar);
        editText = findViewById(R.id.editTextCode);
        buttonSignIn = findViewById(R.id.buttonSignIn);

        String phoneNumber = getIntent().getStringExtra("phoneNumber");
        sendVerificationCode(phoneNumber);

        // 保存手机号到SharedPreferences
        SharedPreferences prefs = getApplicationContext().getSharedPreferences("USER_PREF", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString("phoneNumber", phoneNumber);
        editor.apply();

        buttonSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String code = editText.getText().toString().trim();
                if (code.isEmpty() || code.length() < 6) {
                    editText.setError("Enter code...");
                    editText.requestFocus();
                    return;
                }
                verifyCode(code);
            }
        });
    }

    private void verifyCode(String code) {
        PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);
        signInWithCredential(credential);
    }

    private void signInWithCredential(PhoneAuthCredential credential) {
        mAuth.signInWithCredential(credential)
                .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                            if(user!=null){
                                progressBar.setVisibility(View.VISIBLE);
                                // 查询当前用户的数据库记录
                                String userId = user.getUid();
                                users.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                                        progressBar.setVisibility(View.GONE);
                                        if (snapshot.exists()) {
                                            // 解析用户数据(需要对应UserModel实体类)
                                            UserModel userModel = snapshot.getValue(UserModel.class);
                                            // 检查必填字段是否存在且不为空
                                            if (userModel != null 
                                                && userModel.getUsername() != null && !userModel.getUsername().isEmpty()
                                                && userModel.getEmail() != null && !userModel.getEmail().isEmpty()) {
                                                // 字段齐全,跳转到主页
                                                Intent intent = new Intent(VerifyPhoneActivity.this, DriverHome.class);
                                                startActivity(intent);
                                                finish();
                                            } else {
                                                // 缺少必填信息,跳转到注册页面补充
                                                Intent intent = new Intent(VerifyPhoneActivity.this, RegisterActivity.class);
                                                intent.putExtra("userId", userId);
                                                intent.putExtra("phoneNumber", getIntent().getStringExtra("phoneNumber"));
                                                startActivity(intent);
                                                finish();
                                            }
                                        } else {
                                            // 首次登录,无数据库记录,直接跳注册页面完善信息
                                            Intent intent = new Intent(VerifyPhoneActivity.this, RegisterActivity.class);
                                            intent.putExtra("userId", userId);
                                            intent.putExtra("phoneNumber", getIntent().getStringExtra("phoneNumber"));
                                            startActivity(intent);
                                            finish();
                                        }
                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError error) {
                                        progressBar.setVisibility(View.GONE);
                                        Toast.makeText(VerifyPhoneActivity.this, "查询用户信息失败: " + error.getMessage(), Toast.LENGTH_LONG).show();
                                    }
                                });
                            }else {
                                Intent intent = new Intent(VerifyPhoneActivity.this, StartActivity.class);
                                startActivity(intent);
                                finish();
                            }
                        }else {
                            Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
                            progressBar.setVisibility(View.GONE);
                        }
                    }
                });
    }

    private void sendVerificationCode(String number) {
        progressBar.setVisibility(View.VISIBLE);
        PhoneAuthProvider.getInstance().verifyPhoneNumber(
                number,
                60,
                TimeUnit.SECONDS,
                TaskExecutors.MAIN_THREAD,
                mCallBack
        );
        progressBar.setVisibility(View.GONE);
    }

    private PhoneAuthProvider.OnVerificationStateChangedCallbacks mCallBack = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        @Override
        public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
            super.onCodeSent(s, forceResendingToken);
            verificationId = s;
        }

        @Override
        public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {
            String code = phoneAuthCredential.getSmsCode();
            if (code != null) {
                editText.setText(code);
                verifyCode(code);
            }
        }

        @Override
        public void onVerificationFailed(FirebaseException e) {
            Toast.makeText(VerifyPhoneActivity.this, e.getMessage(), Toast.LENGTH_LONG).show();
            progressBar.setVisibility(View.GONE);
        }
    };
}

第二步:创建UserModel实体类

需要一个实体类来映射Firebase数据库里的用户数据,确保字段和数据库里的键名一致:

public class UserModel {
    private String username;
    private String email;
    private String phoneNumber;

    // Firebase要求必须有空构造函数
    public UserModel() {}

    // 带参数的构造函数(可选,方便创建对象)
    public UserModel(String username, String email, String phoneNumber) {
        this.username = username;
        this.email = email;
        this.phoneNumber = phoneNumber;
    }

    // Getter和Setter方法
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }
}

第三步:配置Firebase数据库规则

确保已认证用户可以读写自己的信息,修改数据库规则为:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

第四步:注册页面补充逻辑

在RegisterActivity中,接收传递的userId和phoneNumber,当用户填写完用户名、邮箱后,将数据保存到Firebase数据库的users/{userId}节点下,保存完成后再跳转到主页。

内容的提问来源于stack exchange,提问作者H.Olwan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:54:44