我对我的认证代码进行了一些测试,调用注册活动,并成功地使用电子邮件密码注册,将数据放到数据库中,并最终决定我的下一个活动并完成我的注册活动。
当我关闭并重新打开我的应用程序时,会引发问题,在哪里主要活动运行并执行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("");
...
这段代码是我为每个用户/提供者提供的第一个侦听器,如果我在通过FB或Google登录后重新打开我的应用程序,它将运行良好。这个问题仅适用于我使用电子邮件密码登录/注册的用户。我尝试过调试,用户不是空的,但它包含奇怪的键,如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]
发布于 2017-03-27 13:12:11
您遇到了崩溃,因为FirebaseUser
还没有任何displayName集,所以方法getDisplayName()
返回null
,然后在空对象引用上调用另一个方法toString()
(顺便说一下,在这里调用toString()
是多余的,因为getDisplayName()
方法已经返回了String
)。
在使用之前先核对一下。
if (!TextUtils.isEmpty(user.getDisplayName())){
//user has displayname so you can use it
}
您可以看到here如何在创建配置文件之后更新用户的displayName。当用户注册电子邮件和密码时,大多数时候都需要这样做。当用户注册社交网站时,displayName将从社交网站的个人资料中获取。
https://stackoverflow.com/questions/43054236
复制