【问题标题】:Firebase UserProfileChangeRequest isn't workingFirebase UserProfileChangeRequest 不起作用
【发布时间】:2017-03-28 02:34:16
【问题描述】:

我正在尝试创建个人资料活动,用户可以在其中更改这些个人资料图片和显示名称,我正在尝试更新用户照片或用户名,调用 CompleteListener,task.isSuccessful = true 但完成了,为什么?

更新名称的功能:

FirebaseUser mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
final String newName;
newName = input.getText().toString();
UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
.setDisplayName(newName)
.build();
mFirebaseUser.updateProfile(profileUpdates)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
DatabaseReference mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference().child("users");
   mFirebaseDatabaseReference.child(mFirebaseUser.getUid()).child("DisplayName").setValue(newName);
updateUI();
Toast.makeText(ProfileActivity.this, "User display name updated.", Toast.LENGTH_SHORT).show();
} else
Toast.makeText(ProfileActivity.this, "Error while updating display name.", Toast.LENGTH_SHORT).show();
}
});

当我尝试更新我刚刚上传到 Firebase 存储的个人资料图片时也是如此...

还有什么想法?

编辑:

有时用户名真的会更新,我认为更新需要超过 10 分钟,为什么?

【问题讨论】:

  • 用户是使用createUserWithEmailAndPassword()创建的吗?
  • 我正在使用 Google 登录创建用户,用户在控制台中应用。
  • 我注意到,如果您注销并再次登录,它会更新。但它似乎不会马上更新。

标签: android firebase firebase-authentication


【解决方案1】:

我遇到过类似的问题,用户信息在用户重新认证之前没有更新。我还通过将此信息保存在我的 firebase 数据库中来解决它。对我来说,这是有道理的,因为我希望用户能够获得其他用户的基本信息。

我的代码最终看起来像这样。创建或修改帐户后,我调用了“users/{uid}”端点并在那里更新了对象。从这里我使用GreenRobot EventBus 将我的新用户对象发送给订阅者,以便在屏幕上更新。

private FirebaseUser firebaseUser;

public void createUser(String email, String password, final User user, Activity activity, final View view) {
    FirebaseAuth.getInstance().createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                Log.d(TAG, "createUserWithEmail:onComplete:" + task.isSuccessful());

                // If sign in fails, display a messsage to the user. If sign in successful
                // the auth state listener will be notified and logic to handle
                // signed in user can be handled in the listener
                if (!task.isSuccessful()) {
                    Snackbar.make(view, task.getException().getLocalizedMessage(), Snackbar.LENGTH_SHORT).show();
                } else {
                    firebaseUser = task.getResult().getUser();

                    UserProfileChangeRequest profileUpdates = new UserProfileChangeRequest.Builder()
                        .setDisplayName(user.displayName)
                        .build();
                    firebaseUser.updateProfile(profileUpdates);
                    updateDatabase(user);

                    EventBus.getDefault().post(new LoginEvent());
                }
            }
        });
}

public boolean updateDatabase(User user) {
    if (firebaseUser == null) {
        Log.e(TAG, "updateDatabase:no currentUser");
        return false;
    }

    return userReference.setValue(user).isSuccessful();
}

数据库观察器的设置是这样完成的。请注意,您需要确保在用户注销时删除侦听器,并在用户登录时添加新侦听器。

protected void setupDatabaseWatcher() {
    String uid = firebaseUser.getUid();

    userReference = FirebaseDatabase.getInstance().getReference("users/" + uid);
    userReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.
            User user = dataSnapshot.getValue(User.class);
            Log.d(TAG, "Value is: " + user);

            EventBus.getDefault().post(new UserUpdateEvent(user));
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
            Log.w(TAG, "Failed to read value.", error.toException());
        }
    });
}

【讨论】:

    【解决方案2】:

    使用这个简单的代码:

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

    【讨论】:

    • .Builder().build(); (!??)....smh....我永远不会想出那个,谢谢。
    猜你喜欢
    • 2014-08-04
    • 2018-09-18
    • 2018-06-26
    • 2018-02-07
    • 2016-12-05
    • 2018-10-22
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多