我可以通过Smack获取我的好友列表中的在线用户吗?

10

我能否通过Smack API获取我的好友列表中的在线用户?这可能吗?

我正在开发一款用户之间进行聊天的应用程序。我已经成功创建了一个聊天应用程序示例,只需输入朋友的名称即可发送聊天消息,但现在我想要在线好友列表。

5个回答

21
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());
}

1
谢谢,但我如何确定在线或离线状态?你能解释一下吗? - chikka.anddev
1
我写了相同的代码,但每个用户都呈现为“不可用”,即使已有4-5个用户处于“可用”状态,但它向我显示所有用户都不可用,请问有人可以帮我解决吗? - mayank_droid
3
我也一样。我只看到“不可用”的状态:/ - Muten Roshi
xmppConnection.getRoster()没有提供更新后的花名册条目。你有什么想法吗? - arjun

6
    XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() {

        @Override
        public void connectionCreated(Connection arg0) {
            Log.i(TAG, "receive xmpp connection : " + arg0);
            connection = arg0;
            roster = arg0.getRoster();

            Collection<RosterEntry> entries = roster.getEntries();
            Presence presence;

            Log.e(TAG, "user count" + entries.size());

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

                Log.i(TAG, "" + entry.getUser());
                Log.i(TAG, "" + presence.getType().name());
                Log.i(TAG, "" + presence.getStatus());
            }

        }
    });

在程序开始时,注册XMPPConnection监听器,通常需要几秒钟才能接收到连接对象。

但仅当您仅在此情况下使用creatEntry时,它才起作用,此时rooster将看到这些创建的用户。

要使用Roster创建条目,请使用以下代码:

try {
    rooster.createEntry("name", "user_id", null);
} catch (XMPPException e) {
    e.printStackTrace();
}

我没有使用任何群组,在第二个设备上成功地看到了用户。



4
Presence presence = roster.getPresence("tom@jabber.org");
if (presence.getType() == Presence.Type.AVAILABLE) {
   // Tom is online...
}

reference from this link


1
我需要询问关于XMPP的几个问题,我已经能够在列表视图中获取我的花名册好友,现在我想在列表视图中仅显示在线用户,请问应该怎么做,您能指导一下吗? - Ali Ashiq

1
smackAndroid = SmackAndroid.init(this);
XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() {

    @Override
    public void connectionCreated(XMPPConnection connection) {

          Log.i("hello", "receive xmpp connection : " + connection);
          roster = connection.getRoster();

          try {
              roster.createEntry("2868254", "hello", null);
          } catch (XMPPException e) {
              e.printStackTrace();
          } catch (NotLoggedInException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (NoResponseException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (NotConnectedException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
});

你能为这个添加一些解释吗? - apaul

1
使用presence.getMode()方法获取用户的模式。 模式是枚举类型,其值可以是chat、available、away、xa、dnd。

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