我在注册过程中从用户那里获得了一些信息。我想将每个用户名注册为唯一。我的方法如下。
if(!nameRegister.isEmpty() && !surnameRegister.isEmpty()
&& !usernameRegister.isEmpty() && !emailRegister.isEmpty()
&& !passwordRegister.isEmpty() && !passwordConfirmRegister.isEmpty()){
if (passwordRegister.equals(passwordConfirmRegister)) {
isUsernameTaken = checkUsernameIsExist(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
if(!isUsernameTaken)
isMailAuthenticationSuccess = createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
}else{
passwordConfirm.setError("Passwords does not match.");
passwordConfirm.requestFocus();
}
if(isMailAuthenticationSuccess)
saveUserToFirebase(newUser);
}
其内容如下。
private boolean checkUsernameIsExist(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, final String passwordRegister) {
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference docIdRef = rootRef.collection("users").document(usernameRegister);
docIdRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
isUsernameTaken = true;
Log.d(TAG, "Document exists!");
Toast.makeText(Register.this, "User name already taken", Toast.LENGTH_LONG).show();
} else {
Log.d(TAG, "Document does not exist!");
Toast.makeText(Register.this, "User can be taken", Toast.LENGTH_LONG).show();
}
} else {
Log.d(TAG, "Failed with: ", task.getException());
}
}
});
return isUsernameTaken;
}
private boolean createUserWithEmailAndPassword(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, String passwordRegister) {
auth.createUserWithEmailAndPassword(emailRegister, passwordRegister)
.addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
email.setError("Mail is already taken");
email.requestFocus();
}else{
newUser = new User(nameRegister, surnameRegister, usernameRegister, emailRegister);
isMailAuthenticationSuccess = true;
auth.signOut();
startActivity(new Intent(Register.this, Login.class));
finish();
}
}
});
return isMailAuthenticationSuccess;
}
private static void saveUserToFirebase(User newUser) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
firebaseFirestore.collection("users").document(newUser.getUsername())
.set(newUser)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "User add success.");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "user can not be added.", e);
}
});
}
方法无法将真实的布尔值添加到我的变量中。我认为,在分配值给我的布尔值之前,addOnCompleteListener并没有结束。
但是,如果可以在控制用户名之后获得用户名,则用户身份验证成功,但不会写入Firebase。这可能是什么原因?我正在等待您的帮助。
答案 0 :(得分:0)
在此方法“ checkUsernameIsExist”的onSuccess中将此方法称为“ createUserWithEmailAndPassword”,并确保您的返回类型为空。
答案 1 :(得分:0)
一个简单的建议是,在设置saveUserToFirebase(newUser)
之前,您需要在createUserWithEmailAndPassword()
函数内调用isMailAuthenticationSuccess = true;
或在内部调用该函数
if(!isUsernameTaken){
isMailAuthenticationSuccess = createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
if(isMailAuthenticationSuccess)
saveUserToFirebase(newUser); }
那可能会解决您的问题。
或者您可以尝试以下代码
if(!nameRegister.isEmpty() && !surnameRegister.isEmpty() && !usernameRegister.isEmpty() && !emailRegister.isEmpty() && !passwordRegister.isEmpty() && !passwordConfirmRegister.isEmpty()){
if (passwordRegister.equals(passwordConfirmRegister)) {
checkUsernameIsExist(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
}else{
passwordConfirm.setError("Passwords does not match.");
passwordConfirm.requestFocus();
}
}
//checkUsernameIsExist
private void checkUsernameIsExist(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, final String passwordRegister) {
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference docIdRef = rootRef.collection("users").document(usernameRegister);
docIdRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
isUsernameTaken = true;
Log.d(TAG, "Document exists!");
Toast.makeText(Register.this, "User name already taken", Toast.LENGTH_LONG).show();
} else {
Log.d(TAG, "Document does not exist!");
Toast.makeText(Register.this, "User can be taken", Toast.LENGTH_LONG).show();
createUserWithEmailAndPassword(nameRegister, surnameRegister, usernameRegister, emailRegister, passwordRegister);
}
} else {
Log.d(TAG, "Failed with: ", task.getException());
}
}
});
}
// createUserWithEmailAndPassword
private void createUserWithEmailAndPassword(final String nameRegister, final String surnameRegister, final String usernameRegister, final String emailRegister, String passwordRegister) {
auth.createUserWithEmailAndPassword(emailRegister, passwordRegister)
.addOnCompleteListener(Register.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if(!task.isSuccessful()){
email.setError("Mail is already taken");
email.requestFocus();
}else{
newUser = new User(nameRegister, surnameRegister, usernameRegister, emailRegister);
saveUserToFirebase(newUser);
isMailAuthenticationSuccess = true;
auth.signOut();
startActivity(new Intent(Register.this, Login.class));
finish();
}
}
});
}
private static void saveUserToFirebase(User newUser) {
FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
firebaseFirestore.collection("users").document(newUser.getUsername())
.set(newUser)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "User add success.");
Toast.makeText(Register.this, "User added successfully", Toast.LENGTH_LONG).show();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "user can not be added.", e);
Toast.makeText(Register.this, "Couldn't add User. Try again later.", Toast.LENGTH_LONG).show();
}
});
}