Firebase user.getDisplayName()返回null

时间:2018-04-26 07:23:38

标签: android firebase firebase-authentication

我尝试使用Firebase身份验证添加用户,并将displayName返回为null,即使它在注册时通过UI请求它。任何想法为什么以及如何解决?当我注销然后使用相同的凭据登录到应用程序时,显示名称是可见的。

还附上截图:

When registering for the first time

When logging in again with same credentials

以下是我用来执行此操作的代码:

private void userProfile(){
    FirebaseUser user = firebaseAuth.getCurrentUser();
    if(user != null){
        UserProfileChangeRequest profileUpdate = new UserProfileChangeRequest.Builder()
                .setDisplayName(editTextName.getText().toString().trim()).build();

        user.updateProfile(profileUpdate).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if(task.isSuccessful()){
                    Log.d("Testing", "User Profile Updated");
                }
            }
        });
    }
}

我使用以下代码在下一个Activity上显示它:

FirebaseUser user = firebaseAuth.getCurrentUser();
textViewUserName.setText("Welcome "+ user.getDisplayName());

该代码适用于user.getEmail()和Firebase提供的其他参数,但不适用于user.getDisplayName()

2 个答案:

答案 0 :(得分:1)

在我的情况下,我使用这种方式,我希望对你有所帮助。

FirebaseUser user = firebaseAuth.getCurrentUser();
    if (user != null) {
    // User is Login            
    String displayName = user.getDisplayName();

    // If the above were null, iterate the provider data
    // and set with the first non null data
    for (UserInfo userInfo : user.getProviderData()) {
        if (displayName == null && userInfo.getDisplayName() != null) {
            displayName = userInfo.getDisplayName();
        }
    }

    textViewUserName.setText("Welcome "+ displayName);
    }

答案 1 :(得分:1)

我遇到了同样的问题,因为就像你在第一次登录时所说的那样,在你要求显示名称之前没有完成登录功能..

我的解决方案是将所有获取名称功能放在postDelay中,以便它有时间完成初始化登录,以便您可以获取名称。

试试这个 -

textViewUserName.postDelayed(new Runnable() {
        @Override
        public void run() {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            textViewUserName.setText("Welcome "+ user.getDisplayName());
        }
    },1000);

让我知道它是否有效。

更新 - 第一个没有解决它的结果的另一个解决方案 -

使用共享首选项将名称保存在注册活动的注册功能中,然后从主活动中将其拉出。

让自己成为PrefsManager类 -

public class PrefsManager {
  public static void setCurrentUserName(String name){
      SharedPreferences.Editor editor = getSharedPreferences(CURRENT_USER_NAME, MODE_PRIVATE).edit();
      editor.putString("name", userName);
      editor.apply();
  }

  public static String getCurrentUserName(){
      SharedPreferences prefs = getSharedPreferences(CURRENT_USER_NAME, MODE_PRIVATE); 
      if (prefs.getString("name", null) != null) {
      String name = prefs.getString("name", "");//The empty "" is for default value.
      return name;
  }
}

然后在寄存器功能中保存 -

PrefsManager.setCurrentUserName(name)

在MainActivity函数中将其拉回 -

textViewUserName.setText("Welcome "+ PrefsManager.getCurrentUserName());

希望这可行,但请记住,您必须跟踪共享首选项中的值始终是最新的,这意味着一旦您注销,在其中放入一个空值,并在登录/ new寄存器时插入当前用户的价值。

这是一种解决此问题的方法。 让我知道是否设法让它发挥作用。