获取XMPP离线消息

3
在我的聊天应用中,我希望在用户登录时(如果有人给他发送了消息),获取离线消息。当用户处于在线状态时,我能够收到通知,但是在用户重新登录后无法获取消息。我已经检查了xmpp log cat,能够在那里阅读到离线消息,但我无法通知用户他/她的离线消息。
以下是我在服务的onStart中使用的监听器:
PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        final PacketCollector collector = connection.createPacketCollector(filter);
        connection.addPacketListener(new PacketListener() {

            @Override
            public void processPacket(Packet packet) {
                // TODO Auto-generated method stub
                //notification(packet.getFrom());
                packet = collector.nextResult();
                Message message = (Message)packet;
                senderName = packet.getFrom();

                int alphaPOS = senderName.indexOf("@");
                String subSenderName = senderName.substring(0,alphaPOS); 


                if(UserChatActivity.checkPresence==false){

                    notificationforChat(subSenderName+": "+message.getBody(),packet.getFrom().toString());

               }

            }

        }, filter);

    }

当用户在线时,这个方案很好。但是我希望用户登录后能够收到通知消息。

谢谢。

2个回答

2

您必须确保您的XMPP服务器支持XMPP的消息存档扩展XEP 0136

同样的扩展将解释如何检索已归档的消息。

对于ejabberd,您可以安装并配置mod_archive扩展以实现此功能。 它将把消息保存到SQL后端。


感谢@JC Brand的帮助。上面的方法不是一个解决方案吗?许多程序员都已经成功地按照上述方法实现了。日志记录还显示了离线消息。我亲眼见过。 - Gaurav Arora
如果你只是想获取用户离线时发送给他/她的消息,那么我认为这在很大程度上取决于你的XMPP服务器。我使用ejabberd,它会在用户登录后立即发送离线消息。 - JC Brand
好的,感谢您的帮助。好的,你的意思是好的,但我认为应该反过来。我们能不能用其他方式,比如上面提到的或离线消息管理器类型的方式来做呢? - Gaurav Arora
@JCBrand 你有没有解决办法? - CoronaPintu

0

将过滤器更改为过滤 Message.class 类型的消息,而不是聊天消息,因为离线消息不属于聊天类型(我认为)

PacketFilter filter = new PacketTypeFilter(Message.class);

看看你能做到什么。

实际上,重新阅读你的问题;你是说你可以在LogCat中看到接收到的离线消息,但在屏幕上看不到吗?你在哪里记录接收到的消息?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接