【发布时间】:2021-08-12 07:59:54
【问题描述】:
我正在尝试在我的 Android 应用程序中创建一个注册页面,但我已经为一个错误苦苦挣扎了几天。 将用户添加到 Firebase 时,它会显示在 Auth 页面中,但实时数据库保持清晰(未创建子节点)... 在第一次按下“注册”按钮时,用户被添加到身份验证中,但由于某种原因,没有显示 Toast。 在第二次按下时,弹出一个 Toast 说“注册失败”(因为该帐户已经创建)。
如何将用户添加到数据库?我的代码有问题吗?
代码如下:
private void registerUser() {
final String email = edEmail.getText().toString().trim();
final String password = edPassword.getText().toString().trim();
final String confirmPassword = edConfirmPassword.getText().toString().trim();
if (email.isEmpty()) {
edEmail.setError("An Email is required!");
edEmail.requestFocus();
return;
}
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
edEmail.setError("Please provide a valid Email!");
edEmail.requestFocus();
return;
}
if (password.isEmpty()) {
edPassword.setError("A password is required!");
edPassword.requestFocus();
return;
}
if (password.length() < 8) {
edPassword.setError("The password is too short!");
edPassword.requestFocus();
return;
}
if (!password.equals(confirmPassword)) {
edConfirmPassword.setError("The passwords in both fields must match!");
edConfirmPassword.requestFocus();
return;
}
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull @NotNull Task<AuthResult> task) {
if (task.isSuccessful()) {
User user = new User(email, password);
FirebaseDatabase.getInstance().getReference("Users")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid())
.setValue(user)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull @NotNull Task<Void> task) {
if (task.isSuccessful()) {
Toast.makeText(RegisterPage.this, "User has been registered successfully", Toast.LENGTH_LONG).show();
Log.i("RegisterPage", "User has been registered successfully");
goToLoginPage();
} else {
Toast.makeText(RegisterPage.this, "Failed to register user!", Toast.LENGTH_LONG).show();
Log.i("RegisterPage", "Failed to register user!");
}
}
});
} else {
Toast.makeText(RegisterPage.this, "Failed to register!", Toast.LENGTH_LONG).show();
Log.i("RegisterPage", "Failed to register!");
}
}
});
}
第一次按“注册”后,进入第一个if(task.isSuccessful()),表示任务成功。然后它只是跳过第二个OnComplete(数据库之一)。第二次按下“注册”后,第一个if(task.isSuccessful()) 为假,因此它转到下面的else 并弹出一个祝酒词(因为用户已经创建并且位于 Firebase 上的身份验证页面中)。第一次按下task.getException() 后什么都不返回,第二次后它返回:
2021-05-24 02:37:00.678 24492-24492/com.fulminatix.gymlog W/RegisterPage: createUserWithEmail:failure
com.google.firebase.auth.FirebaseAuthUserCollisionException: The email address is already in use by another account.
at com.google.android.gms.internal.firebase-auth-api.zzto.zza(com.google.firebase:firebase-auth@@21.0.1:25)
at com.google.android.gms.internal.firebase-auth-api.zzuw.zza(com.google.firebase:firebase-auth@@21.0.1:9)
at com.google.android.gms.internal.firebase-auth-api.zzux.zzl(com.google.firebase:firebase-auth@@21.0.1:1)
at com.google.android.gms.internal.firebase-auth-api.zzuu.zzk(com.google.firebase:firebase-auth@@21.0.1:25)
at com.google.android.gms.internal.firebase-auth-api.zztl.zzh(com.google.firebase:firebase-auth@@21.0.1:1)
at com.google.android.gms.internal.firebase-auth-api.zzoc.zza(com.google.firebase:firebase-auth@@21.0.1:2)
at com.google.android.gms.internal.firebase-auth-api.zzvb.zza(com.google.firebase:firebase-auth@@21.0.1:23)
at com.google.android.gms.internal.firebase-auth-api.zzul.zzn(com.google.firebase:firebase-auth@@21.0.1:4)
at com.google.android.gms.internal.firebase-auth-api.zzpt.zzl(com.google.firebase:firebase-auth@@21.0.1:5)
at com.google.android.gms.internal.firebase-auth-api.zztp.zzg(com.google.firebase:firebase-auth@@21.0.1:8)
at com.google.android.gms.internal.firebase-auth-api.zzqg.accept(com.google.firebase:firebase-auth@@21.0.1:3)
at com.google.android.gms.common.api.internal.zacj.doExecute(com.google.android.gms:play-services-base@@17.1.0:2)
at com.google.android.gms.common.api.internal.zaf.zac(com.google.android.gms:play-services-base@@17.1.0:6)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zac(com.google.android.gms:play-services-base@@17.1.0:167)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zab(com.google.android.gms:play-services-base@@17.1.0:139)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zabg(com.google.android.gms:play-services-base@@17.1.0:99)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zabe(com.google.android.gms:play-services-base@@17.1.0:40)
at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.onConnected(com.google.android.gms:play-services-base@@17.1.0:19)
at com.google.android.gms.common.internal.zaf.onConnected(com.google.android.gms:play-services-base@@17.1.0:2)
at com.google.android.gms.common.internal.BaseGmsClient$zzg.zzj(com.google.android.gms:play-services-basement@@17.1.0:24)
at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(com.google.android.gms:play-services-basement@@17.1.0:12)
at com.google.android.gms.common.internal.BaseGmsClient$zzb.zzo(com.google.android.gms:play-services-basement@@17.1.0:11)
at com.google.android.gms.common.internal.BaseGmsClient$zzc.handleMessage(com.google.android.gms:play-services-basement@@17.1.0:49)
at android.os.Handler.dispatchMessage(Handler.java:106)
at com.google.android.gms.internal.common.zzi.dispatchMessage(com.google.android.gms:play-services-basement@@17.1.0:8)
at android.os.Looper.loop(Looper.java:246)
at android.os.HandlerThread.run(HandlerThread.java:67)
【问题讨论】:
-
如果你在
if (task.isSuccessful()) {上都设置了断点并在调试器中运行,它应该在其中一行或两行上停止。从那里逐步执行代码,并检查需要哪个分支。也不是说如果任务失败,它的task.getException()会返回有关失败原因的详细信息——这在这里可能非常有用。 -
感谢您的回复!第一次按“注册”后,进入第一个
if(task.isSuccessful()),表示任务成功。然后它只是跳过第二个OnComplete(数据库之一)。第二次按下“注册”后,第一个if(task.isSuccessful())为假,因此它转到下面的else并弹出一个祝酒词(因为用户已经创建并且位于 Firebase 上的身份验证页面中)。第一次按下task.getException()后什么都不返回,第二次按下后它返回:SHOWN IN THE QUESTION BECAUSE ITS TOO LONG@FrankvanPuffelen -
1) 我建议只关注第一次运行。由于您希望这会成功,因此第二次运行提供(预期)问题的事实并不相关。 2) 你是否在内部
if(task.isSuccessful())上设置了断点?如果它从未到达该断点,这通常意味着数据库 SDK 无法到达其后端服务器。 -
我做到了。它永远不会到达它......那么我该如何解决它?我在我的应用程序级别
build.gradle中有implementation 'com.google.firebase:firebase-database',我可以在 Firebase 的网站上看到数据库树(它只是空的..)@FrankvanPuffelen -
我测试了数据库,但它没有在 Firebase 中记录信息。
FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); myRef.setValue("Hello, World!");@FrankvanPuffelen
标签: android firebase firebase-realtime-database firebase-authentication