2016-11-14 34 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()); 
     } 
    }); 
}