如何使用Smack从Android客户端获取openfire在线注册用户?

时间:2016-07-21 18:20:30

标签: android android-studio openfire smack

我正在尝试创建聊天应用。 - 我在本地机器上安装了openfire服务器 - 并通过openfire服务器管理面板添加了一些用户 - 现在我想在android Emulator中显示所有可用的用户。 - 我能够连接到openfire服务器使用aSmack lib。但是在connection.getRoster();。

上得到错误
       ConnectionConfiguration config = new ConnectionConfiguration("10.42.0.3", 5222, "localhost");
        connection = new XMPPConnection(config);

        try {
            connection.connect();
            Log.d("SMACK ", " CONNECTED");


         // list online contacts
            Roster roster = connection.getRoster();
            Collection<RosterEntry> entries = roster.getEntries();
            Log.d("TRACE", "entries.size()=" + entries.size());
            for (RosterEntry e : entries) {
               Log.d("PRESENCE", e.getUser() + "=" + roster.getPresence(e.getUser()).isAvailable());
               if (roster.getPresence(e.getUser()).isAvailable()) {
                  Log.d("ADD", "NAME_KEY=" + e.getName() + " USERJID_KEY=" + e.getUser());
                  //contacts.add(contact);
               }
            }
       }
        catch (XMPPException e){
            Log.e("XMPPChatDemoActivity", "Failed to connect to "+ connection.getHost());
            Log.e("XMPPChatDemoActivity", e.toString());
        }

此代码在此行上给出错误  connection.getRoster(); 没找到。

我在这里 依赖

compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.1'
compile 'com.android.support:design:22.2.1'
compile 'com.google.android.gms:play-services:8.3.0'

compile "org.igniterealtime.smack:smack-java7:4.1.0"
// Optional for XMPPTCPConnection
compile "org.igniterealtime.smack:smack-tcp:4.1.0"
// Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …)
compile "org.igniterealtime.smack:smack-im:4.1.0"
// Optional for XMPP extensions support
compile "org.igniterealtime.smack:smack-extensions:4.1.0"

2 个答案:

答案 0 :(得分:1)

Smack没有这样的功能。但是您可以使用REST API获取用户列表。 为此,请在插件存储库中安装服务器端的rest api插件。然后在客户端添加rest api client

Maven:

<dependency>
    <groupId>org.igniterealtime</groupId>
    <artifactId>rest-api-client</artifactId>
    <version>1.1.3</version>
</dependency>

Gradle:

compile 'org.igniterealtime:rest-api-client:1.1.3'

示例:

AuthenticationToken token = new AuthenticationToken("rest_api_token");
RestApiClient client = new RestApiClient("host", port, token);
UserEntities entities = client.getUsers();    // UserEntities have all users list including admin.

**您将在服务器的rest api部分获得rest api token。

答案 1 :(得分:0)

您无法从名册中获取服务器上的所有注册用户,因为名单不同。名单就像个人用户的地址簿一样,所以将会有人加入名册或从名册中删除。

如果用户未添加到名单中,则您的XMPPClient无法访问其他用户详细信息。此外,由于名册就像个人通讯录,所以名册通常对特定用户jid有不同的缺口,而不是他/她在服务器上注册的名字。

简而言之,您需要通过http / rest apis访问它。 你可以在你的openfire管理控制台上启用rest api,你可以在android端使用这个rest api客户端。 - https://github.com/xibsked/Openfire-Rest-Api-Client-Android

有一个应用已经在使用这个api,就像一个Openfire管理控制台 - https://play.google.com/store/apps/details?id=com.sked.ofadmin

实施非常简单 -

OfApiClient.with(this).account(account).getUser("admin",
            new Listener<User>() {
                @Override
                public void onResponse(Object mTag, User user) {
                    //Handle Success
                }
            },
            new ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    //Handle Failure
                }
            });