在Firebase群组消息传递应用中实施已读回执功能

9 java android firebase firebase-realtime-database firebase-cloud-messaging

我想在我的Firebase群组消息应用中实施"看到"功能.您能否建议采用最佳和最有效的方法(工作代码将受到赞赏)?例如,应用程序将在群组消息上显示" 由6看到 "或" 由15看到 ".

这是我的项目:https://github.com/firebase/friendlychat/tree/master/android

这是MainActivity:https://github.com/firebase/friendlychat/blob/master/android/app/src/main/java/com/google/firebase/codelab/friendlychat/MainActivity.java

Ale*_*amo 5

为此,您需要在Firebase数据库中添加另一个名为的节点,该节点seenBy必须嵌套在messageIdin meassage节中。您的数据库应如下所示:

Firebase-root
   |
   ---- messages
           |
           ---- messageId1
                   |
                   ---- meessage: "Hello!"
                   |
                   ---- timestamp: 1498472455940
                   |
                   ---- seenBy
                          |
                          ---- userUid1: John
                          |
                          ---- userUid2: Mary
                          |
                          ---- userUid3: George
Run Code Online (Sandbox Code Playgroud)

每当新用户打开一条消息时,只需添加uid和即可,name如上所述。

要实现Seen by 6选项,这非常容易。您只需要创建一个listener和使用getChildrenCount()方法,如下所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference seenByRef = rootRef.child("messages").child(messageId).child("seenBy");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long seenBy = dataSnapshot.getChildrenCount();
        Lod.d("TAG", "Seen by: " + seenBy);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
seenByRef.addListenerForSingleValueEvent(eventListener);
Run Code Online (Sandbox Code Playgroud)

要知道是否已打开消息,您需要在用户部分添加另一个字段,在其中需要添加boolean默认值为的false。这个新部分应如下所示:

Firebase-root
   |
   ---- users
       |
       ---- userId1
           |
           ---- meessages
              |
              ---- messageId1: false
              |
              ---- messageId2: false
              |
              ---- messageId3: false
Run Code Online (Sandbox Code Playgroud)

当用户打开该消息时,只需将特定消息的值从设置falsetrue,这意味着该特定消息已被打开。这是代码:

DatabaseReference openedRef = rootRef.child("users").child(userId).child("meessages").child("messageId1");
openedRef.setValue(true);
Run Code Online (Sandbox Code Playgroud)

创建消息时,请push()在引用上使用如下方法:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference messageRef = rootRef.child("meessages").push();
String messageKey = messageRef.getKey();
Run Code Online (Sandbox Code Playgroud)

有了此密钥,您可以在中使用它DatabaseReference。以相同的方式,您可以将其用于userId。

希望能帮助到你。