我正在使用asmack 8-0.8.3。
当我的联系人转移到"可用"时,我不会收到有关Presence更改的消息。 如果一个联系人从"可用"到了" dnd",我确实收到了一条消息。但不是相反。
Contact passes: "available" --> "dnd" --> "available" --> "dnd"
I receive: Presence{dnd} Presence{dnd}
我期望在2 dnd之间收到Presence更新{available}。
由于我收到了状态更新,除了"可用"我想我的听众工作正常。另外我想我正确订阅了我的联系人'存在...
private class FriendListener implements RosterListener {
public void entriesAdded(Collection<String> addresses) { }
public void entriesUpdated(Collection<String> addresses) { }
public void entriesDeleted(Collection<String> addresses) { }
public void presenceChanged(Presence presence) {
String fromUserID = StringUtils.parseBareAddress(presence.getFrom());
System.out.println(
"Presence changed: " + fromUserID +
" Presence=" + presence.toString() +
" Type=" + presence.getType().toString() +
" Mode=" + presence.getMode().toString()
);
mainCallback_.updatePresenceFriend(fromUserID, presence);
}
}
public void subscribe(String friendID, String friendName) {
Presence presence = new Presence(Presence.Type.subscribe);
connection.sendPacket(presence);
RosterPacket rosterPacket = new RosterPacket();
rosterPacket.setType(IQ.Type.SET);
Item item = new Item(friendID, friendName);
item.setItemType(RosterPacket.ItemType.both);
rosterPacket.addRosterItem(item);
connection.sendPacket(rosterPacket);
System.out.println("Send subscribe to " + friendID);
subscribedUsers.add(friendID);
}
答案 0 :(得分:0)
我发现了问题!
实际上我的Listener的日志中有一个错误,这一行:
System.out.println(
"Presence changed: " + fromUserID +
" Presence=" + presence.toString() +
" Type=" + presence.getType().toString() +
" Mode=" + presence.getMode().toString()
);
当Presence.getMode()== null时它崩溃了,所以我没有处理Presence消息。但是日志中没有显示coredump,我猜是因为监听器在另一个线程中...... 通过以下行更改日志解决了问题
System.out.println(
"Presence changed: " + fromUserID +
" Presence=" + presence.toString()
);