我正在尝试更新三个客户端的存在,其中两个是Adium& Pidgin和我的自定义构建应用程序。当我从我的应用程序发送状态时,它可以将可用状态和状态设置为“室内”:
ConnectionConfiguration connConfig =
new ConnectionConfiguration(host, Integer.parseInt(port), service);
connection = new XMPPConnection(connConfig);
presence = new Presence(Presence.Type.available,"In Room",1,Presence.Mode.available);
connection.sendPacket(presence);
但是当我更新来自其他IM的状态时,可以说Adium,当我从我的APP更新状态时,它无法更新状态和状态,其他明智的Adium和Pidgin相互协作。我意识到由于我的APP,有些事情出了问题。我实现了在线数据包监听器:如果我改变了Pidgin或Adium的存在感,这个监听器正在监听它应该监听
connection.addPacketListener(new PacketListener(){
@Override
public void processPacket(Packet presencePkt) {
Presence pres= ((Presence) presencePkt);
presence.setPriority(1);// presence is global variable
switch(pres.getMode()){
case available: presence.setMode(pres.getMode());
//connection.sendPacket(pres);
break;
case dnd: presence.setMode(pres.getMode());
//connection.sendPacket(pres);
break;
default :
break;
}
}
}, new PacketTypeFilter(Presence.class));
答案 0 :(得分:0)
使用自定义PresencePacketListener
是98%的错误方法。相反,您希望添加自己的RosterListener
和Roster.addRosterListener()
,以对您名单中实体的状态更改做出反应。
确保两个jabber实体至少具有订阅模式来自或两者,以便服务器将存在节转发给您的客户端。
如果您想获得帐户的其他资源/完整JID的状态。试试Roster.getPresences(StringUtils.parseBareAddress(connection.getUser()))
答案 1 :(得分:0)
我刚刚读到你对Flow的评论,这个答案很晚,但其他人可能需要同样的答案;
答案仍然是使用Flow建议的RosterListener
(根据我使用Smack的经验)。
使用RosterListener,您将收到您自己的用户以及其他用户的状态更改(来往和将来都是您自己的用户名)。这意味着名单会跟踪您,因此您可以使用Roster#getPresences(username)
方法从不同来源获取您的状态的有序列表,您可以使用Roster#getUser()
文档here涵盖了主题,并且基本上解释了不同的模式具有不同的优先级,因此(例如)如果任何客户端让您“可用”,那么使用Roster#getPresence(username)
(单数)将返回可用。
如果您愿意,名册还允许您设置/更改这些优先级/顺序。希望这有助于某人!