我对我的身份验证代码进行了一些测试,调用了注册活动,并使用电子邮件密码成功注册,将数据放入数据库中,最后用于我的下一个活动并完成我的注册活动..
当我关闭并重新打开我的应用程序时问题出现了,主要活动在哪里运行并执行auth监听器以获取当前用户
// [START auth_state_listener]
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
final User NewUser = new User();
NewUser.setName(user.getDisplayName().toString()); //ERROR HERE , ATTEMPT INVOKE NULL OBJECT
NewUser.setAddress("");
...
此代码是我的第一个auth监听器,适用于每个用户/提供商,如果我在通过FB或Google登录后重新打开我的应用程序,则运行良好。问题仅限于我使用电子邮件密码登录/注册的用户。我试图调试,用户不是null但它包含奇怪的密钥,如zzDBY,zzbYH等
所以关于在此行NewUser.setName(user.getDisplayName().toString());
原因是什么以及如何解决这个问题?我如何获得我的身份证明数据?
这是我的注册码:
private void createAccount(String email, String password, String password2, String name, String dob, String gender) {
Log.d("REGISTER USER", "createAccount:" + email);
if (!validateForm()) {
return;
}
showProgressDialog();
// [START create_user_with_email]
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()) {
if (task.getException() instanceof FirebaseAuthUserCollisionException) {
Toast.makeText(UserRegistration.this, "Failed - EMAIL ALREADY REGISTERED", Toast.LENGTH_SHORT).show();
}
} else {
//do nothing
}
hideProgressDialog();
// ...
}
});
注册过程成功后,我的registerActivity中的auth监听器完成剩下的工作:
// [START auth_state_listener]
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
User Newuser = new User(name,email,"-","-",dobText,gender,10,"-",services,transactions,0);
// new user node would be /users/$userid/
String userId = mDatabase.push().getKey(); //generate Primary Key
// mDatabase.child("Users").child(userId).child("username").setValue(name);
//pushing user to 'users' node using the userId
mDatabase.child("Users").child(userId).setValue(Newuser);
// send to next activity
Intent home = new Intent(UserRegistration.this , HomeActivity.class);
startActivity(home);
Log.d(TAG, "Register:onAuthStateChanged:signed_in:" + user.getUid());
finish();
} else {
// User is signed out
Log.d(TAG, "Register:onAuthStateChanged:signed_out");
}
}
};
// [END auth_state_listener]
答案 0 :(得分:0)
您遇到了崩溃,因为cf restage <your-app>
尚未设置任何displayName,因此方法FirebaseUser
会返回getDisplayName()
,然后您正在调用另一个方法null
null对象引用(btw调用toString()
在这里是多余的,因为方法toString()
已经返回getDisplayName()
)。
在使用之前进行检查。
String
您可以在创建个人资料后看到here如何更新用户的displayName。当用户使用电子邮件和密码注册时,大多数情况下都需要这样做。当用户注册社交时,displayName将从社交网站中获取&#39;然后。