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

时间:2017-06-18 11:02:51

标签: 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

2 个答案:

答案 0 :(得分:5)

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

Firebase-root
   |
   ---- messages
           |
           ---- messageId1
                   |
                   ---- meessage: "Hello!"
                   |
                   ---- timestamp: 1498472455940
                   |
                   ---- seenBy
                          |
                          ---- userUid1: John
                          |
                          ---- userUid2: Mary
                          |
                          ---- userUid3: George

每次新用户打开meesage时,只需按照上述说明添加uidname

要实施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);

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

Firebase-root
   |
   ---- users
       |
       ---- userId1
           |
           ---- meessages
              |
              ---- messageId1: false
              |
              ---- messageId2: false
              |
              ---- messageId3: false

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

DatabaseReference openedRef = rootRef.child("users").child(userId).child("meessages").child("messageId1");
openedRef.setValue(true);

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

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference messageRef = rootRef.child("meessages").push();
String messageKey = messageRef.getKey();

拥有此密钥后,您可以在DatabaseReference中使用它。以与userId相同的方式使用。

希望它有所帮助。

答案 1 :(得分:2)

是的,有可能,您可以在邮件中添加子seen_by,只要用户查看邮件将查看者userId附加到seen_by,然后检索userID即可可以计算查看者的数量,也可以查看已查看成员的列表。格式应为

message:{
    FirebaseKey:{
        message:"hi",
        timestamp:1498472455940,
        seen_by:"abc,def,ghi" //users UID
      }
    }