使用 Android 上的 Smack API 获取在服务器上注册并具有在线/离线状态的所有用户的列表

Posted

技术标签:

【中文标题】使用 Android 上的 Smack API 获取在服务器上注册并具有在线/离线状态的所有用户的列表【英文标题】:Getting list of all users registered on server with online/offline status using Smack API on android 【发布时间】:2016-02-23 09:32:27 【问题描述】:

我正在使用 Smack API 连接到 ejabberd XMPP 服务器 -

        username = "admin";
        password = "admin";
        port = "5222";
        serviceName = "davids-macbook-pro.local";
        host = "192.168.20.8";

     config = XMPPTCPConnectionConfiguration.builder()
                    .setUsernameAndPassword(username, password)
                    .setHost(host)
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                    .setServiceName(serviceName)
                    .setPort(Integer.parseInt(port))
                    .build();

            connection = new XMPPTCPConnection(config);
            try 
                connection.connect();
                connection.login();
             catch (SmackException e) 
                e.printStackTrace();
             catch (IOException e) 
                e.printStackTrace();
             catch (XMPPException e) 
                e.printStackTrace();
            

我想获取所有在线用户的列表。怎么可能?

当我尝试时 -

Roster roster = Roster.getInstanceFor(connection);
Collection<RosterEntry> entries = roster.getEntries();
Log.i("entry", entries+"");
for (RosterEntry entry : entries) 


获取一个空数组

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

【问题讨论】:

你是指所有在服务器上注册的在线用户,还是所有作为联系人添加到当前用户名册的在线用户? 我的意思是所有在服务器上注册的用户。 How do I get a list of all online users in ejabberd/XMPP?的可能重复 我想知道用于连接的库。你能评论一下依赖关系吗?我无法连接到它发送 Smack Exception 的服务器 如果您不是管理员,则无法获取服务器上的所有注册用户。如果您想获取所有名册 getEntries,请先将用户添加到您的名册中。 【参考方案1】:
     for (RosterEntry entry : entries) 

                HashMap<String, String> map = new HashMap<String,String>();
                 Presence entryPresence = roster.getPresence(entry.getUser());

                Presence.Type type = entryPresence.getType();       

                map.put("USER", entry.getName().toString());
                map.put("STATUS", type.toString());
                Log.e("USER", entry.getName().toString());

                usersList.add(map);

        

检查 STATUS 是否等于 'available' 则用户在线,否则用户离线。

【讨论】:

我正在为 Collection 获取空数组条目 = roster.getEntries(); 所以我不能使用 'for (RosterEntry entry : entries)' 进行迭代,因为 'entries' 为空。 @Adrian 您是否找到了如何获取所有用户的解决方案?在线和离线?【参考方案2】:

Roaster 中的用户 getPresence 如下所示。

        Roster roster = Roster.getInstanceFor(connection);
        Collection<RosterEntry> entries = roster.getEntries();
        for (RosterEntry rosterEntry : entries)

            System.out.println("xmpp.Roster.presence "+ roster.getPresence(rosterEntry.getUser()).getType());
        

【讨论】:

以上是关于使用 Android 上的 Smack API 获取在服务器上注册并具有在线/离线状态的所有用户的列表的主要内容,如果未能解决你的问题,请参考以下文章

在 Android Studio 上使用 Smack 构建 XML 流消息

android 在 facebook 聊天中使用 smack api

Smack 4.1 所需的最低 Android API 级别是多少?

如何使用 smack API 从 Google Talk 获取我的个人资料图片?

找不到提供程序类 SMACK 4.1.1 Android

在 MainActivity android 中使用 smack API 与服务器连接