使用asmack检索脱机消息

时间:2014-04-04 13:47:59

标签: android openfire asmack

我是asmack和openfire的新手,看了很多工作的答案,但在任何地方找不到它。如何在asmack上登录我的帐户时检索离线消息?

我使用了以下代码:

      configure(ProviderManager.getInstance()); //configuring providers before creating a connection

            ConnectionConfiguration connConfig =  new ConnectionConfiguration(HOST, PORT);

            connConfig.setSendPresence(false);

      connection =  new  XMPPConnection (connConfig); 


     try {
       connection.connect();


     } catch (XMPPException ex) {

         setConnection(null);
     }
      try {


        connection.login(username, password);


        try { 
                  OfflineMessageManager offlineManager = new OfflineMessageManager( 
                    connection);
            Iterator<org.jivesoftware.smack.packet.Message> it = offlineManager 
                    .getMessages(); 
            System.out.println(offlineManager.supportsFlexibleRetrieval()); 
            System.out.println("Number of offline messages:: " + offlineManager.getMessageCount()); 
            Map<String,ArrayList<Message>> offlineMsgs = new HashMap<String,ArrayList<Message>>();   
            while (it.hasNext()) { 
                org.jivesoftware.smack.packet.Message message = it.next(); 
                System.out 
                        .println("receive offline messages, the Received from [" + message.getFrom() 
                                + "] the message:" + message.getBody()); 
                String fromUser = message.getFrom().split("/")[0]; 

                if(offlineMsgs.containsKey(fromUser)) 
                { 
                    offlineMsgs.get(fromUser).add(message); 
                }else{ 
                    ArrayList<Message> temp = new ArrayList<Message>(); 
                    temp.add(message); 
                    offlineMsgs.put(fromUser, temp); 
                } 
            } 
            // Deal with a collection of offline messages ... 

            offlineManager.deleteMessages(); 
        } catch (Exception e) { 
                  Log.e("CATCH","OFFLINE");
            e.printStackTrace(); 
        }

        Presence presence = new Presence(Presence.Type.available);

        connection.sendPacket(presence);
        setConnection(connection);//Packet Listener






        // Set the status to available



          } catch (XMPPException ex) {

            setConnection(null);
          }

根据我的阅读,一旦建立连接,Openfire会自动向用户发送离线消息。 (如果有的话)这意味着通过在登录后设置数据包监听器,我应该能够检索消息。但是,这对我不起作用。这就是我尝试使用OfflineMessageManager的原因。它总是显示0条消息作为消息计数。我甚至登录到服务器使用的mysql数据库并检查了脱机消息文件夹。消息一直存在,直到用户登录,这意味着消息正在发送但应用程序未检索到消息。我似乎无法找出如何实现这一点。如果有人有一个有效的解决方案,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

我部分解决了登录后添加了一个数据包监听器,但是当互联网出现故障时,同样的问题仍然存在。在这种情况下,我拦截reconnectionSuccessful事件并删除并再次添加数据包侦听器,但是当用户离线时发送的消息将丢失。

有人有解决它的最佳解决方案吗?

答案 1 :(得分:0)

发送您的状态afetr登录XMPP服务器。您忘记添加侦听即将发布的脱机消息的packetListener。 希望这有效。