【问题标题】:Android with Smack -How to get list of online users?Android with Smack - 如何获取在线用户列表?
【发布时间】:2016-12-12 10:15:46
【问题描述】:

我正在使用 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 吗?
  • 是的..请检查已编辑的问题

标签: android xmpp chat smack


【解决方案1】:

您可以使用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 尝试 RosterListener
【解决方案2】:

Presence 它由 TYPE(如:Presence.Type.availablePresence.Type.unavailable)和来自用户的自定义可空 status(如“Hello World!”或“今天我很开心”或“工作中”现在”)。

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

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

【讨论】:

  • 我不想设置我的状态..我想要其他用户的状态,我没有找到任何像“sendStanza”这样的连接对象方法
  • 每个用户只能设置自己的“状态”,所以基本上如果所有人都设置自己的状态,您将能够将其作为不为空的字符串来获取。当然,您必须管理 null 作为 getStatus 的可能性(检查并设置为“”)。如果您没有找到任何“connection.sendStanza()”方法,只需使用旧的“sendPacket”,您使用的是旧版本的 SMACK。
  • 好吧,让我按照你的建议试试
  • 我再次阅读了您的问题,可能有一个很大的误导:在 Openfire(或任何服务器)中,“状态”意味着“已连接 || 已断开 || foo”到服务器。客户端,“状态”它被映射并用 Presence 屏蔽,这是一个允许任何用户向他人屏蔽自己的系统(例如:Skype 的不可见)、可用(和在线)、请勿打扰(和在线)等等。用户在服务器在线时可能不可用(对于允许通过名册检查可用性的其他用户)。此外,Presence 有一个“状态”,它就像 Skype 的个人消息一样只是一条消息。服务器状态对客户端不可见
  • 状态意义上的,我想在发送他/她的消息之前检查用户是否与开火服务器连接
猜你喜欢
  • 2014-01-26
  • 1970-01-01
  • 2015-04-18
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多