【问题标题】:Why cant I see the username of this user?为什么我看不到这个用户的用户名?
【发布时间】:2016-01-01 11:38:48
【问题描述】:

我正在使用 Firebase 通过电子邮件和密码进行用户身份验证,我想从 authData 检索用户的用户名,但我只看到 uid。我想检索用户名,以便可以在另一个活动中显示它。

这是我的代码:

      button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ref.authWithPassword(email.getText().toString(), password.getText().toString(), new Firebase.AuthResultHandler() {
                @Override
                public void onAuthenticated(AuthData authData) {
                    setContentView(R.layout.activity_user_display);
                    Map<String, String> map = new HashMap<String, String>();
                    map.put("provider", authData.getProvider());
                    if(authData.getProviderData().containsKey("displayName")){
                        map.put("displayName", authData.getProviderData().get("displayName").toString());
                    }
                    else
                    {
                        Context c = getApplicationContext();
                        Toast t = Toast.makeText(c, "You thought you had it", Toast.LENGTH_SHORT);
                    }
                    ref.child("users").child(authData.getUid()).setValue(map);

                }

                @Override
                public void onAuthenticationError(FirebaseError firebaseError) {
                    Context c = getApplicationContext();
                    Toast error = Toast.makeText(c,"Sorry :)",Toast.LENGTH_SHORT);
                }
            });
        }
    });`

结果就是上面代码的结果:

谢谢。

【问题讨论】:

    标签: android firebase-authentication


    【解决方案1】:

    您可能应该创建一个单独的数据库来存储客户端的用户名。由于 uid 存储了该特定客户端的所有信息,因此您可能需要一个单独的数据库。

    这可能对你有帮助:

    About Authentication using email

    About Auth() Variable

    Similar Question for retrieving email in FireBase

    希望对你有所帮助。

    【讨论】:

      【解决方案2】:

      当您使用电子邮件和密码身份验证时,Firebase 只需要一个电子邮件地址和相应的密码来对用户进行身份验证。与社交提供程序(Google、Facebook、Twitter、Github)不同,Firebase 不会在底层提供程序中查找其他字段。请参阅properties that are available in authData for the email+password provider 的文档。

      您可以轻松地将displayName 字段添加到您的注册表单,但您必须自己跟踪它并使用不同的代码路径将其存储在数据库中。例如

      Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
      ref.createUser(email.getText().toString(), password.getText().toString(), new Firebase.ValueResultHandler<Map<String, Object>>() {
          @Override
          public void onSuccess(Map<String, Object> result) {
              Map<String, String> map = new HashMap<String, String>();
              map.put("provider", authData.getProvider());
              if(authData.getProviderData().containsKey("displayName")){
                  map.put("displayName", authData.getProviderData().get("displayName").toString());
              }
              else {
                  // read the display name from the text field
                  map.put("displayName", displayName.getText().toString);
              }
              ref.child("users").child(authData.getUid()).setValue(map);
          }
          @Override
          public void onError(FirebaseError firebaseError) {
              // there was an error
          }
      });
      

      然后在您的登录流程中,确保不要使用 updateChildren() 覆盖 displayName

            button.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  ref.authWithPassword(email.getText().toString(), password.getText().toString(), new Firebase.AuthResultHandler() {
                      @Override
                      public void onAuthenticated(AuthData authData) {
                          setContentView(R.layout.activity_user_display);
                          Map<String, String> map = new HashMap<String, String>();
                          map.put("provider", authData.getProvider());
                          if(authData.getProviderData().containsKey("displayName")){
                              map.put("displayName", authData.getProviderData().get("displayName").toString());
                          }
      
                          ref.child("users").child(authData.getUid()).updateChildren(map);
      
                      }
      

      【讨论】:

      • 感谢您回答我的问题。据我了解,登录时会返回AuthData,那么如果在注册过程中没有返回AuthData 对象,AuthData 的方法如何工作?
      猜你喜欢
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多