Android:如何使用电话号码登录用户

时间:2019-12-18 06:06:05

标签: java android firebase firebase-realtime-database firebase-authentication

我正在创建一个应用程序,如果已注册用户的电话号码已注册到该应用程序中,我希望在该应用程序中将其重定向到其个人资料,但是如果他是新用户,则将其重定向到欢迎页面。 问题是,我可以获取电话号码的验证码,但是无论它是现有用户还是新用户,它始终都重定向到欢迎页面。 到目前为止,我已经实现了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身份验证发送的OTP,并且如果数据库中已经存在电话号码,则应直接从用户的个人资料页面而不是欢迎屏幕显示,但是,如果电话号码是新的,应该转到欢迎页面而不是用户个人资料页面。 我面临的挑战是我无法检查输入的数字是否已经存在于用户表的数据库中(我创建了一个单独的用户表来存储用户注册时的详细信息。第一次)。

1 个答案:

答案 0 :(得分:2)

据我了解,您可以注册用户,但无法将未注册的用户重定向到登录/注册屏幕,如果是这种情况,则可以尝试使用

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();
            }
        }
    });
}

首先,您必须使用电话详细信息登录该用户,然后检查是否有任何用户使用该电话号码注册,如果这样做,则表明该用户已经输入了该应用程序,但您没有输入该应用程序如果没有该电话号码的用户的任何信息,那么您创建他的信息,并在创建他的信息后将他定向到欢迎屏幕,因此,如果该用户再次回来,您将检查我们是否有该电话号码的用户记录(我们这样做),所以这次他将被定向到个人资料屏幕