使用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
相关产品推荐
相关产品推荐

