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

带Smack的Android-如何获取在线用户列表?,android,xmpp,chat,smack,Android,Xmpp,Chat,Smack,我正在使用jivesoftware Smack SDk进行实时聊天功能。 对于创建连接,我使用以下代码 XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder(); config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); config.setServiceName("world

我正在使用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");
它的工作非常好。 现在的问题是,我想获取特定用户的在线状态,或者获取所有在线用户的列表。 我已经尝试了很多解决堆栈溢出的方法,但是没有一种对我有效。 我尝试的解决方案之一是

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());
 }
Presence=newpresence(Presence.Type.available);
连接。发送数据包(存在);
花名册=xmppConnection.get花名册();
集合条目=花名册.getEntries();
存在;
对于(排班条目:条目){
状态=花名册.getPresence(entry.getUser());
System.out.println(entry.getUser());
System.out.println(presence.getType().name());
System.out.println(presence.getStatus());
}
这将返回一个列表,但所有用户的状态都为空。 请有人帮我找到准确的答案


感谢您

状态信息由用户提供的
类型
(如:
状态信息.类型.可用
状态信息.类型.不可用
)和自定义的可空状态(如“Hello World!”或“Today I'm happy”或“正在工作”)

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

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

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

Presence subscribe = new Presence(Presence.Type.subscribe);
subscribe.setTo('another_user@example.com');
connection.sendPacket(subscribe);
“其他用户”应以同样的方式批准您的请求:

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

您的客户是否发送状态信息?是..请检查编辑的问题我不想设置我的状态。。我想要其他用户的状态,我没有找到任何像“sendStanza”这样的连接对象的方法。每个用户只能设置自己的“状态”,所以基本上,如果所有用户都设置了自己的状态,你就可以将其作为一个不为null的字符串。当然,您必须管理null作为getStatus的可能性(选中它并设置为“”)。如果你找不到任何“连接。StEnStasZa()”方法,只使用旧的“StEnPad”,你使用的是一个旧版本的SMAK。好吧,让我试试你的建议,我再次阅读你的问题,可能有一个很大的误导:在OpenFi火(或任何服务器)“状态”的意思是“连接的不连接”Foo服务器。客户端,“状态”通过状态映射和屏蔽,这是一个允许任何用户向他人屏蔽自己(例如:Skype的不可见)、可用(和在线)、请勿打扰(和在线)等的系统。用户在服务器中在线时可能不可用(允许其他用户通过花名册检查可用性)。此外,状态有一个“状态”,它只是一条类似Skype的个人信息。服务器状态对clientsStatus来说是不可见的。从某种意义上说,我想在发送用户信息之前检查用户是否已连接到open fire服务器。好的,是否有侦听器侦听用户状态的更改?@Jay Vyas try RosterListener