Android with Smack -如何获取在线用户列表?

3

我正在使用 jivesoftware Smack SDk 实现实时聊天功能。 为了创建连接,我正在使用以下代码,

XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
    config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);

    config.setServiceName("world-pc");
    config.setHost(serverAddress);
    config.setPort(5222);
    config.setDebuggerEnabled(true);
    XMPPTCPConnection.setUseStreamManagementResumptiodDefault(true);
    XMPPTCPConnection.setUseStreamManagementDefault(true);
    connection = new XMPPTCPConnection(config.build());
    XMPPConnectionListener connectionListener = new XMPPConnectionListener();
    connection.addConnectionListener(connectionListener);
    connection.connect();
    connection.login("username","password");

它的工作非常出色。 现在问题是,我想要获取特定用户的在线状态或获取所有在线用户的列表。 我尝试了许多来自stackoverflow的解决方案,但都不适用于我。 我尝试过的其中一个解决方案是:

Presence presence = new Presence(Presence.Type.available);
connection.sendPacket(presence);
Roster roster = xmppConnection.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
Presence presence;

for(RosterEntry entry : entries) {
presence = roster.getPresence(entry.getUser());

System.out.println(entry.getUser());
System.out.println(presence.getType().name());
System.out.println(presence.getStatus());
 }

这个命令返回了一个列表,但所有用户的状态都为空。请有经验的人提供准确的解决方案。
谢谢。

你的客户发送了出席信息吗? - MrPk
是的,请检查编辑后的问题。 - Jay Vyas
2个回答

3

您可以使用Presence.Type.subscribe来了解(作为用户),另一个用户的状态:

Presence subscribe = new Presence(Presence.Type.subscribe);
subscribe.setTo('another_user@example.com');
connection.sendPacket(subscribe);

而且“another_user”应以同样的方式批准您的请求:

Presence subscribe = new Presence(Presence.Type.subscribe);
subscribe.setTo('another_user@example.com');
connection.sendPacket(subscribe);

好的,是否有监听器监听用户状态变化? - Jay Vyas
@Jay Vyas try RosterListener - MrPk

2

Presence(出席状态)由一个TYPE(例如:Presence.Type.availablePresence.Type.unavailable)和用户的自定义可空status(例如:“你好,世界!”或“今天我很开心”或“正在工作中”)组成。

要设置状态,只需在发送之前设置即可:

Presence presence = new Presence(Presence.Type.available);
presence.setStatus("Online and ready to chat");
connection.sendStanza(presence); //or old one: connection.sendPacket(presence)

我不想设置我的状态, 我想获取其他用户的状态, 但是我没有找到连接对象的“sendStanza”方法。 - Jay Vyas
每个用户只能设置自己的“状态”,因此基本上如果所有人都设置了自己的状态,您将能够将其作为字符串而不是null获取。当然,您必须管理getStatus的null可能性(检查并设置为“”)。如果找不到任何“connection.sendStanza()”方法,请使用旧版本的“sendPacket”,您正在使用旧版本的SMACK。 - MrPk
好的,让我按照您的建议尝试一下。 - Jay Vyas
我再次阅读了你的问题,也许存在一个很大的误导:在Openfire(或任何服务器)中,“状态”意味着对服务器的“已连接||未连接||其他”状态。客户端,“状态”被映射和掩盖为“Presence”,这是一个允许任何用户向其他人掩盖自己的系统(例如:Skype的隐身),可用(并在线),请勿打扰(并在线)等等。一个用户可以在服务器上在线但对于其他允许检查可用性的用户不可用(通过Roster)。此外,Presence还有一个“状态”,就像Skype的个人消息一样。服务器状态对客户端不可见。 - MrPk
状态感知, 我想在向用户发送消息之前检查他/她是否已连接到Openfire服务器。 - Jay Vyas
我的答案解决了“Roster中的状态为空”的问题,但是关于“Sense中的状态”,你需要从@manolodewin的答案开始。 - MrPk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接