【问题标题】:Create new user with Names , Username etc in firebase在 firebase 中使用 Names 、 Username 等创建新用户
【发布时间】:2016-08-28 12:44:21
【问题描述】:

我是新的 android 学习者,所以我很难做我在文档中找不到的东西。这是我创建用户的代码

 mAuth.createUserWithEmailAndPassword(email,password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if(task.isSuccessful()){
                        //Successfully Registered
                        Toast.makeText(RegisterActivity.this, "Registration Successful", Toast.LENGTH_SHORT).show();
                    }else {
                        //Error occurred during registration
                        Toast.makeText(RegisterActivity.this, "Registration Unsuccessful", Toast.LENGTH_SHORT).show();
                        try {
                            throw task.getException();
                        } catch(FirebaseAuthWeakPasswordException e) {
                            editTextPassword.setError(e.getMessage());
                            editTextPassword.requestFocus();
                        }catch(FirebaseAuthUserCollisionException | FirebaseAuthInvalidCredentialsException e) {
                            editTextEmail.setError(e.getMessage());
                            editTextEmail.requestFocus();
                        } catch(Exception e) {
                            Log.e(RegisterActivity.class.getName(), e.getMessage());
                        }
                    }
                    progressDialog.dismiss();
                }
            });

这只需要两个参数(电子邮件和密码)来创建用户。要创建具有更多字段的用户,我应该采取什么方法。

我还添加了FirebaseAuth.AuthStateListener() 来检查用户登录状态。但是,当我在成功用户登录后调用firebaseAuth.getCurrentUser().getDisplayName() 时,它会像往常一样返回null。那么如何使用名称创建用户以便我可以使用firebaseAuth.getCurrentUser().getDisplayName() 检索它。

【问题讨论】:

标签: android firebase firebase-authentication


【解决方案1】:

注册成功后,

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

UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
        .setDisplayName("Jane Q. User")
        .build();

编辑:此代码有点不完整,因为从未访问过 profileUpdates

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

然后,要检索它,请在需要的地方使用它,

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
    // Name, email address etc
    String name = user.getDisplayName();
    String email = user.getEmail();
}

【讨论】:

  • getDisplayName() 总是会给出空指针异常;
  • @kshitijjain 但是已经有一个 if 条件来检查它
  • 检索更新后的 displayName 似乎有延迟。我认为它会在 onComplete() 中保持稳定,并且由于它是 Void 类型,因此您无法在返回的任务中得到任何有趣的东西。有没有简单的解决方法?
【解决方案2】:

要添加具有额外信息(例如用户名或其他必需信息)的用户,您应该使用 Firebase 实时数据库将这些数据存储在成功完成电子邮件和密码注册后生成的唯一 user_id 下。

在注册表单中获取用户输入的姓名,

String name = mNameField.getText().toString().trim();

onComplete方法中添加用户名:

 @Override
 public void onComplete(@NonNull Task<AuthResult> task) {
 if(task.isSuccessful()){

     String user_id = mAuth.getCurrentUser().getUid;

     DatabaseReference current_user = mDatabase.child(user_id);

     current_user.child("name").setValue(name);

     progressDialog.dismiss();

  } 

【讨论】:

  • 可以对规则进行哪些修改,以便在注册期间授予uid 节点下的写入权限,而不是设置".read": true, ".write": true。让我们假设我的树结构 root-->users-->uid-->name @ramithdr
猜你喜欢
  • 2016-08-03
  • 2022-10-14
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
相关资源
最近更新 更多