2016-11-14 35 views
3

我正在尝试创建一个配置文件活动,用户可以在其中更改这些配置文件图片和显示名称,我试图更新用户照片或用户名称,调用CompleteListener,task.isSuccessful = true但没有做完,为什么?Firebase UserProfileChangeRequest不起作用

功能更新名称:

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(); 
} 
}); 

当我尝试更新,我只是上传到火力地堡寄存档案图片一样...

和想法?

编辑:

有时候真名得到更新,我认为这是采取像超过10分钟,更新,为什么?

+0

用户日志是用户使用'createUserWithEmailAndPassword()'创建的时候? –

+0

我使用Google Signin创建用户,用户在控制台中出现。 – Nirel

+0

我注意到它更新,如果你注销并再次..但它似乎并没有马上做到。 –

回答

2

我有一个类似的问题,用户信息没有更新,直到用户重新认证。我通过将这些信息保存在我的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(); 
} 

数据库观察器的设置是这样做的。请注意,您需要确保您删除监听器,当用户注销,并添加新1英寸

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()); 
     } 
    }); 
}