我尝试使用Firebase身份验证添加用户,并将displayName返回为null,即使它在注册时通过UI请求它。任何想法为什么以及如何解决?当我注销然后使用相同的凭据登录到应用程序时,显示名称是可见的。
还附上截图:
以下是我用来执行此操作的代码:
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()
答案 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寄存器时插入当前用户的价值。
这是一种解决此问题的方法。 让我知道是否设法让它发挥作用。