Firebase getCurrentUser返回奇怪的数据

时间:2017-03-27 18:50:28

标签: android firebase firebase-realtime-database firebase-authentication

我对我的身份验证代码进行了一些测试,调用了注册活动,并使用电子邮件密码成功注册,将数据放入数据库中,最后用于我的下一个活动并完成我的注册活动..

当我关闭并重新打开我的应用程序时问题出现了,主要活动在哪里运行并执行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());

上调用null对象的错误消息

原因是什么以及如何解决这个问题?我如何获得我的身份证明数据?

这是我的注册码:

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]

1 个答案:

答案 0 :(得分:0)

您遇到了崩溃,因为cf restage <your-app>尚未设置任何displayName,因此方法FirebaseUser会返回getDisplayName(),然后您正在调用另一个方法null null对象引用(btw调用toString()在这里是多余的,因为方法toString()已经返回getDisplayName())。

在使用之前进行检查。

String

您可以在创建个人资料后看到here如何更新用户的displayName。当用户使用电子邮件和密码注册时,大多数情况下都需要这样做。当用户注册社交时,displayName将从社交网站中获取&#39;然后。