2014-04-04 2 views
3

저는 asmack과 openfire를 처음 접했고 이에 대한 답변을 많이 보았지만 어디서나 찾을 수 없었습니다. asmack에서 내 계정에 로그인 할 때 오프라인 메시지를 검색하려면 어떻게합니까? 연결이 설정되면 내가 읽은 바로는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 db에 로그인하고 오프라인 메시지 폴더를 확인했다. 메시지는 사용자가 로그인 할 때까지 존재합니다. 즉, 메시지가 전송되었지만 앱에서 검색하지 않는 것을 의미합니다. 나는 이것을 구현하는 방법을 찾을 수없는 것 같습니다. 누구든지 작동하는 솔루션이 있다면 크게 감사하겠습니다.

+2

내 로그인 활동에 처음 로그인 한 다음 사용자 이름과 비밀번호를 기본 채팅 활동으로 보내고 다시 로그인했습니다. 메시지는 로그인하기 전에 설정된 패킷 수신기가없는 첫 번째 활동으로 전송되었습니다. 내가 거기에 로그인하기 전에 패킷 수신기를 설정하고 나는 모든 오프라인 메시지를 잘 볼 수 있습니다. – user3498348

+0

감사합니다. 어리석은 해결책 인 것처럼 보이지만, 완벽하게 작동합니다. – OAEI

+0

@ user3498348 오프라인 메시지를 검색 할 수 있습니까? 나는 당신이 당신의 질문에 대해했던 것과 똑같은 일을하곤했지만 데이터베이스에서 오프라인 메시지를 찾을 수는 없습니다. 당신이 나를 도울 수 –

답변

0

로그인 후 부분적으로 해결 된 패킷 수신기가 있지만 인터넷이 다운 될 때도 동일한 문제가 지속됩니다. 이 경우 나는 reconnectionSuccessful 이벤트를 가로 채고 패킷 리스너를 제거하고 다시 추가하지만 사용자가 오프라인 일 때 보낸 메시지는 손실됩니다.

누군가 해결하기 위해 최선의 해결책이 있습니까?

0

XMPP 서버에 로그인하여 현재 상태를 보냅니다. 예정된 오프라인 메시지를 수신하는 packetListener를 추가하는 것을 잊었습니다. 희망이 있습니다.

관련 문제