Невозможно добавить данные пользователя в базу данных Firebase RealTime. - PullRequest
0 голосов
/ 21 марта 2020

В настоящее время я пытаюсь добавить информацию о пользователях, которые зарегистрировались в моем приложении с использованием аутентификации Firebase Phone, в базу данных Firebase Real time. Я успешно могу подтвердить пользователя, но не могу отправить в класс «Подробности», где мне нужно, чтобы пользователь ввел свои данные, вместо этого я сразу перехожу к MainActivity. Я получаю тост "Phone Verified" всякий раз, когда добавляю нового пользователя.

Регистрация. java

public class Register extends AppCompatActivity {
    FirebaseAuth auth;
    String phoneNumber;
    String otpCode;
    String verificationId;
    EditText phone, optEnter;
    Button next;
    CountryCodePicker countryCodePicker;
    PhoneAuthCredential credential;
    Boolean verificationOnProgress = false;
    ProgressBar progressBar;
    TextView state, resend;
    PhoneAuthProvider.ForceResendingToken token;
    //FirebaseFirestore fStore;
    DatabaseReference reference;

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

        phone = findViewById(R.id.phone);
        optEnter = findViewById(R.id.codeEnter);
        countryCodePicker = findViewById(R.id.ccp);
        next = findViewById(R.id.nextBtn);
        auth = FirebaseAuth.getInstance();
        progressBar = findViewById(R.id.progressBar);
        state = findViewById(R.id.state);
        resend = findViewById(R.id.resendOtpBtn);

        resend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // todo:: resend OTP
            }
        });


        next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if (!phone.getText().toString().isEmpty() && phone.getText().toString().length() == 10) {
                    if (!verificationOnProgress) {
                        next.setEnabled(false);
                        progressBar.setVisibility(View.VISIBLE);
                        state.setVisibility(View.VISIBLE);
                        String phoneNum = "+" + countryCodePicker.getSelectedCountryCode() + phone.getText().toString();
                        Log.d("phone", "Phone No.: " + phoneNum);
                        requestPhoneAuth(phoneNum);
                    } else {
                        next.setEnabled(false);
                        optEnter.setVisibility(View.GONE);
                        progressBar.setVisibility(View.VISIBLE);
                        state.setText("Logging in");
                        state.setVisibility(View.VISIBLE);
                        otpCode = optEnter.getText().toString();
                        if (otpCode.isEmpty()) {
                            optEnter.setError("Required");
                            return;
                        }

                        credential = PhoneAuthProvider.getCredential(verificationId, otpCode);
                        verifyAuth(credential);
                    }

                } else {
                    phone.setError("Valid Phone Required");
                }
            }
        });


    }

    private void requestPhoneAuth(String phoneNumber) {
        PhoneAuthProvider.getInstance().verifyPhoneNumber(phoneNumber, 60L, TimeUnit.SECONDS, this,
                new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

                    @Override
                    public void onCodeAutoRetrievalTimeOut(String s) {
                        super.onCodeAutoRetrievalTimeOut(s);
                        Toast.makeText(Register.this, "OTP Timeout, Please Re-generate the OTP Again.", Toast.LENGTH_SHORT).show();
                        resend.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onCodeSent(String s, PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                        super.onCodeSent(s, forceResendingToken);
                        verificationId = s;
                        token = forceResendingToken;
                        verificationOnProgress = true;
                        progressBar.setVisibility(View.GONE);
                        state.setVisibility(View.GONE);
                        next.setText("Verify");
                        next.setEnabled(true);
                        optEnter.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) {


                        verifyAuth(phoneAuthCredential);

                    }

                    @Override
                    public void onVerificationFailed(FirebaseException e) {
                        Toast.makeText(Register.this, e.getMessage(), Toast.LENGTH_SHORT).show();

                    }
                });
    }

    private void verifyAuth(PhoneAuthCredential credential) {
        auth.signInWithCredential(credential).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    Toast.makeText(Register.this, "Phone Verified", Toast.LENGTH_SHORT).show();
                    checkUserProfile();
                } else {
                    progressBar.setVisibility(View.GONE);
                    state.setVisibility(View.GONE);
                    Toast.makeText(Register.this, "Can not Verify phone and Create Account.", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();

        if (auth.getCurrentUser() != null) {
            progressBar.setVisibility(View.VISIBLE);
            state.setText("Logging IN");
            state.setVisibility(View.VISIBLE);
            checkUserProfile();
        }
    }

    private void checkUserProfile() {
        FirebaseUser firebaseUser = auth.getCurrentUser();
        assert firebaseUser != null;
        String userid = firebaseUser.getUid();
        reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
        if (userid != null) {
            Intent intent = new Intent(Register.this, MainActivity.class);
            startActivity(intent);
        } else {
            Toast.makeText(Register.this, "Profile doesnt exist", Toast.LENGTH_SHORT).show();
            Intent intent = new Intent(Register.this, Details.class);
            startActivity(intent);
        }
    }
}

Подробности. java

public class Details extends AppCompatActivity {
    public static final String TAG = "TAG";
    EditText firstName,lastName,email;
    Button saveBtn;
    FirebaseAuth auth;
    FirebaseFirestore fStore;
    String userID;
    DatabaseReference reference;

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

        firstName = findViewById(R.id.firstName);
        lastName = findViewById(R.id.lastName);
        email = findViewById(R.id.emailAddress);
        saveBtn = findViewById(R.id.saveBtn);

        auth = FirebaseAuth.getInstance();
        fStore = FirebaseFirestore.getInstance();

        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String First_Name=  firstName.getText().toString();
                String Last_Name= lastName.getText().toString();
                String EMail= email.getText().toString();
                    if(firstName.getText().toString().isEmpty()||lastName.getText().toString().isEmpty() || email.getText().toString().isEmpty()){
                    Toast.makeText(Details.this, "Fill the required Details", Toast.LENGTH_SHORT).show();
                    return;
                }

                register(First_Name,Last_Name,EMail);   
            }
        });
}

private void register(String first_name, String last_name, String eMail) {

    FirebaseUser firebaseUser = auth.getCurrentUser();
    assert firebaseUser != null;
    String userid = firebaseUser.getUid();
    reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
    Map<String,Object> hashmap=new HashMap<>();
    hashmap.put("First Name",first_name);
    hashmap.put("Last Name",last_name);
    hashmap.put("Email-Id",eMail);

    reference.setValue(hashmap).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if(task.isSuccessful()){
                Intent intent=new Intent(Details.this,MainActivity.class);
                startActivity(intent);
            }
            else{
                Toast.makeText(Details.this,"Registration failed...",Toast.LENGTH_SHORT).show();
            }
        }
    });
  }
}

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Firebase сгенерирует один уникальный ключ (UID) при регистрации учетной записи, будь то с использованием адреса электронной почты / номера телефона. Этот ключ остается связанным с этой учетной записью, пока учетная запись не существует в списке проверки подлинности firebase.

Итак, как только вы зарегистрируетесь с каким-либо номером или адресом электронной почты, в то время для него будет создан UID. каждый раз, когда вы получаете UID, он будет возвращать этот пользовательский UID, и вы также утверждаете, что Firebase User is NotNull Итак, каждый раз, когда вы получаете UID из firebase, приложение переходит на экран панели мониторинга.

Если вы хотите переместить пользователей на подробном экране тогда. Вы также можете добавить условие на основе Firebase User.

if(firebaseUser != null){
   // Get UID and Move to Dashboard
}else{
  // Move to Detail Screen
}
0 голосов
/ 21 марта 2020

Похоже, что в вашем классе Register в функции checkUserProfile () вы проверяете, имеет ли userId из firebaseUser.getUid () значение NULL. На данный момент это всегда будет не нулевым, потому что вы уже утверждаете, что пользователь должен быть аутентифицирован на этом этапе.

Судя по вашему коду, это просто ошибка с вашей стороны. Я предполагаю, что то, что вы пытаетесь сделать, это посмотреть, есть ли детали в базе данных FirebaseDatabase. У вас есть ссылка на базу данных, которую вы не используете.

private void checkUserProfile() {
            FirebaseUser firebaseUser = auth.getCurrentUser();
            assert firebaseUser != null;
            String userid = firebaseUser.getUid();
            //Unused reference
            reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
            if (userid != null) {
                 Intent intent = new Intent(Register.this, MainActivity.class);
                 startActivity(intent);
}

Но также мой вопрос был бы: вы уверены, что хотите использовать базу данных в реальном времени для информации о пользователе? Вы сохраняете детали в функции Details, используя FirebaseFirestore. Разве вы не хотите проверить, существуют ли детали в FirebaseFirestore?

Как исправить:

Сначала давайте создадим класс пользовательских данных:

public class User {
    public String uid;
    public String firstName;
    public String lastName;
    public String email;

    public User {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public User(String uid, String firstName, String lastName, String email) {
        this.uid = uid;
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }
}

Теперь давайте изменим код в Details. java класс для использования Класс пользователя:

private void register(String first_name, String last_name, String eMail) {

    FirebaseUser firebaseUser = auth.getCurrentUser();
    assert firebaseUser != null;
    String userid = firebaseUser.getUid();
    reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
    User user = new User(userid, firstName, lastName, eMail)

    reference.setValue(user).addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if(task.isSuccessful()){
                Intent intent=new Intent(Details.this,MainActivity.class);
                startActivity(intent);
            }
            else{
                Toast.makeText(Details.this,"Registration failed...",Toast.LENGTH_SHORT).show();
            }
        }
    });
  }

Давайте проверим, существуют ли регистрационные данные в базе данных в методе checkUserProfile ():

private void checkUserProfile() {
                FirebaseUser firebaseUser = auth.getCurrentUser();
                assert firebaseUser != null;
                String userid = firebaseUser.getUid();
                reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);
                reference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                Intent intent = new Intent(Register.this, MainActivity.class);
                    startActivity(intent);
            }
            else {
            Toast.makeText(Register.this, "Profile doesnt exist", Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(Register.this, Details.class);
                startActivity(intent);
            }
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
        }
    });
}

Дайте мне знать, если это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...