我是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数据库并检查了脱机消息文件夹。消息一直存在,直到用户登录,这意味着消息正在发送但应用程序未检索到消息。我似乎无法找出如何实现这一点。如果有人有一个有效的解决方案,我们将不胜感激。
答案 0 :(得分:0)
我部分解决了登录后添加了一个数据包监听器,但是当互联网出现故障时,同样的问题仍然存在。在这种情况下,我拦截reconnectionSuccessful事件并删除并再次添加数据包侦听器,但是当用户离线时发送的消息将丢失。
有人有解决它的最佳解决方案吗?
答案 1 :(得分:0)
发送您的状态afetr登录XMPP服务器。您忘记添加侦听即将发布的脱机消息的packetListener。 希望这有效。