[英]Android: How to login an user with his phone number
我正在创建一个应用程序,如果他们的电话号码已在应用程序中注册,我希望已经注册的用户被重定向到他们的个人资料,但如果他是新用户,那么他将被重定向到欢迎页面。 问题是,我能够获取电话号码的验证码,但无论是现有用户还是新用户,它总是重定向到欢迎页面。 到目前为止,我已经实现了 Firebase 电话身份验证,并且
private void verifyCode(String code) {
PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.getCredential(verificationId, code);
signInWithCredentials(phoneAuthCredential);
}
private void signInWithCredentials(PhoneAuthCredential phoneAuthCredential) {
mAuth.signInWithCredential(phoneAuthCredential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
final String num = getIntent().getStringExtra("phoneNumber");
final Query query = FirebaseDatabase.getInstance().getReference("users").orderByChild("birthday").equalTo(num);
if (task.isSuccessful()) {
if (num.equals(query.toString())) {
Log.i("Method", "Inside if block");
Log.i("value", num + query.toString());
Intent intent = new Intent(VerifyPhoneActivity.this, WelcomeActivity.class);
startActivity(intent);
} else {
Log.i("Method", "Inside if block2");
Log.i("value", num + query.toString());
Intent intent = new Intent(VerifyPhoneActivity.this, ProfileActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
}
} else {
Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}
我只使用用户的电话号码登录/注册,并且没有单独的登录和注册按钮。 它应该以这样的方式工作,一旦 Firebase auth 发送的 OTP 已经过验证并且如果电话号码已经存在于数据库中,它应该直接出现在用户的个人资料页面而不是欢迎屏幕上,但是,如果电话号码是新的,它应该转到欢迎页面而不是用户个人资料页面。 我面临的挑战是我无法检查输入的数字是否已经存在于用户表的数据库中(我创建了一个单独的用户表来存储用户在注册时的详细信息)第一次)。
据我了解,您可以注册用户,但您无法将未注册的用户重定向到登录/注册屏幕,如果是这种情况,那么您可以尝试使用
FirebaseAuth.getInstance().currentUser
在您的欢迎/主页的 on create view 方法中,它应该是这样的
override fun onCreate(savedInstanceState: Bundle?) {
if (FirebaseAuth.getInstance().currentUser == null) {
startActivity(Intent(applicationContext, RegistrationActivity::class.java))
finish()
return
}
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// do your other stuff
}
这段代码是用 kotlin 编写的,在 java 中应该没有什么不同。 希望能帮助到你。
更新 - - -
你的代码有一些错误,试试这个
private void verifyCode(String code) {
PhoneAuthCredential phoneAuthCredential = PhoneAuthProvider.getCredential(verificationId, code);
FirebaseAuth.getInstance().signInWithCredential(phoneAuthCredential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
final String num = getIntent().getStringExtra("phoneNumber");
FirebaseDatabase.getInstance().getReference("users").orderByChild("phoneNumber").equalTo(num).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
Intent intent = new Intent(VerifyPhoneActivity.this, ProfileActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
} else {
FirebaseDatabase.getInstance().getReference("users").push().child("phoneNumber").setValue(num).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Intent intent = new Intent(VerifyPhoneActivity.this, WelcomeActivity.class);
startActivity(intent);
}
});
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
} else {
Toast.makeText(VerifyPhoneActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}
首先,您必须使用电话详细信息登录用户,然后检查是否有任何用户使用该电话号码注册,如果这样做,则意味着该用户已经进入该应用程序,但如果您没有具有该电话号码的用户的信息然后您创建他的信息并在创建他的信息后将他定向到欢迎屏幕,因此如果该用户再次回来,您将检查我们是否有该电话号码的用户记录(我们这样做)所以这次他将被引导到个人资料屏幕
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.