【问题标题】:Firebase setDisplayName of user while creating user Android创建用户Android时用户的Firebase setDisplayName
【发布时间】:2016-11-02 00:47:14
【问题描述】:

创建用户时,我希望能够设置他/她的显示名称。我如何在 Android 中做到这一点?这是我想要实现的示例:

mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
        @Override
        public void onComplete(@NonNull Task<AuthResult> task) {
            if(task.isSuccessful()){
                FirebaseUser.getCurrentUser().setDisplayName(mName); //I want to do this
            }
});

假设所有变量都已正确声明和/或初始化。

【问题讨论】:

  • 建议在发布问题之前创建MCVE
  • @devprashant 我会这样做的

标签: android firebase firebase-authentication


【解决方案1】:

我在 Firebase 文档中找到了答案。我在这里引用它:“如果登录成功,则 AuthStateListener 运行 onAuthStateChanged 回调。在回调中,您可以使用 getCurrentUser 方法获取用户的帐户数据。”这是链接:https://firebase.google.com/docs/auth/android/password-auth#sign_in_a_user_with_an_email_address_and_password

这意味着,如果您执行上述代码(减去 FirebaseUser 行),然后如下所示声明和初始化 Firebase AuthStateListener,您可以设置用户的显示名称,然后继续执行您想要的任何其他活动:

mAuthListener = new FirebaseAuth.AuthStateListener() {
    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
        FirebaseUser user = firebaseAuth.getCurrentUser();
        if(user!=null){
            UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                        .setDisplayName(mName).build();
            user.updateProfile(profileUpdates);
            Intent intent = new Intent(currentActivity.this, nextActivity.class);
            startActivity(intent);
        }
    }
};

不要忘记像这样在 onResume() 中添加 AuthStateListener:

@Override
public void onResume(){
    super.onResume();
    mAuth.addAuthStateListener(mAuthListener);
}

同样,不要忘记在 onStop 方法中将其删除,如下所示:

@Override
public void onStop(){
    super.onStop();
    if(mAuthListener != null){
        mAuth.removeAuthStateListener(mAuthListener);
    }
}

完成了!您设置用户的显示名称,以便您可以在其他活动中使用它。如果您想问候用户或访问与显示名称相关的任何其他用户数据,这将非常有用。

【讨论】:

  • 但在这种情况下,我们会正确地进行两次网络调用吗?不应该有一种方法可以将它组合到一个注册中吗?
  • @Zen 这段代码是检查用户是否登录。如果用户登录,你可以通过进入应用程序的主屏幕(使用意图)来处理,或者你可以转到注册/登录页面。注册/登录代码和此代码通常位于两个不同的活动中,具体取决于您设计应用的方式。
  • 每次调用 onResume 时,此代码都会更新用户配置文件。对吗?
【解决方案2】:

您可以通过编写以下三行代码来设置用户的 Firebase 显示名称:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                    .setDisplayName(mName).build();

user.updateProfile(profileUpdates);

这样做,您的原始代码应如下所示:

mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if(task.isSuccessful()){
            // Sign in is successful
            FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

            UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                .setDisplayName(mName).build();

            user.updateProfile(profileUpdates)
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                  @Override
                  public void onComplete(@NonNull Task<Void> task) {
                      if (task.isSuccessful()) {
                          Log.d(TAG, "User profile updated.");
                      }
                  }
              });
        }
});

Firebase 官方文档: Firebase Update a User's Profile

上述代码的作用是,当用户的帐户使用电子邮件和密码身份验证成功创建后,它将登录用户。 用户登录后,您可以访问用户的 Firebase 用户对象属性并将显示名称属性设置为您想要的任何字符串。

这非常适合在验证电子邮件中测试用户的个人资料名称。

注意:Firebase 用户对象具有一组固定的基本属性 - 唯一 ID、主电子邮件地址、姓名和照片 URL。这些基本属性存储在项目的用户数据库中。 此外,可以通过编程方式更新这些属性。 但是,您不能直接向 Firebase 用户对象添加其他属性;相反,您可以在 Firebase 实时数据库中存储任何其他属性(即用户信息),并从那里引用它们。 (Firebase User Object Properties Doc)

【讨论】:

  • 这个答案将及时登上顶峰。谢谢,按需要工作。
  • 看起来比这个用例接受的答案要干净得多。
  • @moyo 你的代码是什么样的?也许我可以帮助你。
  • user.updateProfile(profileUpdates); 这个调用是非阻塞在主线程上运行的吗?如果是这样,那么如何确保它成功完成。
  • @Adi 您可以将 addOnCompleteListener 附加到它。有关详细信息,请参阅 Firebase 官方文档:firebase.google.com/docs/auth/android/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多