如何在XMPP中添加用户到花名册?

3

我已经成功地使用以下代码创建了一个用户:

accountmanager = new org.jivesoftware.smack.AccountManager(connection);
accountmanager.createAccount(fbuserid,fbuserid);

但是我无法使用以下代码将其他用户添加到已登录用户的花名册中:
 public void createEntry(String user, String name, String[] groups) throws XMPPException {
    // Create and send roster entry creation packet.
    RosterPacket rosterPacket = new RosterPacket();
    rosterPacket.setType(IQ.Type.SET);
    RosterPacket.Item item = new RosterPacket.Item(user, name);
    if (groups != null) {
        for (String group : groups) {
            if (group != null) {
                item.addGroupName(group);
            }
        }
    }
    rosterPacket.addRosterItem(item);
    // Wait up to a certain number of seconds for a reply from the server.
    PacketCollector collector = connection.createPacketCollector(
            new PacketIDFilter(rosterPacket.getPacketID()));
    connection.sendPacket(rosterPacket);
    IQ response = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout());
    collector.cancel();
    if (response == null) {
        throw new XMPPException("No response from the server.");
    }
    // If the server replied with an error, throw an exception.
    else if (response.getType() == IQ.Type.ERROR) {
        throw new XMPPException(response.getError());
    }

    // Create a presence subscription packet and send.
    Presence presencePacket = new Presence(Presence.Type.subscribe);
    presencePacket.setTo(user);
    connection.sendPacket(presencePacket);
}

我总是得到 null 响应。有人能帮我解决吗?先谢谢了。


иҝҷжҳҜдҪ зҡ„д»Јз ҒиҝҳжҳҜSmackзҡ„Rosterзұ»зҡ„дё»дҪ“пјҹдҪ жҳҜеҗҰйҒҮеҲ°дәҶXMPPErrorжҲ–XMPPException - з®ҖеҚ•жқҘиҜҙе°ұжҳҜвҖңжңҚеҠЎеҷЁж— е“Қеә”вҖқпјҹ - Antoniossss
这是Smack的Roster类的一部分,我遇到了XMPP异常。 - Phoenix
你是在测试自己的服务器吗?- 检查日志。如果是第三方,请联系系统管理员,因为可能存在服务器端错误(但未经检查),禁止创建花名册或服务器实现不符合XEP规范。 - Antoniossss
1个回答

7

Rosters和presence使用基于权限的模型,在将用户添加到其他人的花名册之前,用户必须授权。这通过确保只有经过批准的用户能够查看其出席信息来保护用户的隐私。因此,当您添加新的花名册条目时,它将处于待处理状态,直到其他用户接受您的请求。

如果另一个用户请求出席订阅以便将您添加到他们的花名册中,则您必须接受或拒绝该请求。Smack处理出席订阅请求的方式有三种:

自动接受所有出席订阅请求。

自动拒绝所有出席订阅请求。

手动处理出席订阅请求。可以使用Roster.setSubscriptionMode(Roster.SubscriptionMode)方法设置模式。简单客户端通常使用其中一种自动订阅模式,而完整功能的客户端应手动处理订阅请求并让最终用户接受或拒绝每个请求。如果使用手动模式,则应注册PacketListener以侦听具有Presence.Type.subscribe类型的出席数据包。

首先在代码中尝试将用户添加到花名册并请求用户的许可。

    roster = Roster.getInstanceFor(connection);
            if (!roster.isLoaded())
                try {
                    roster.reloadAndWait();
                } catch (SmackException.NotLoggedInException e) {
                    Log.i(TAG, "NotLoggedInException");
                    e.printStackTrace();
                } catch (SmackException.NotConnectedException e) {
                    Log.i(TAG, "NotConnectedException");
                    e.printStackTrace();
                }
   roster.createEntry(jID, name, null);

在另一个用户方面/从一个用户登录后,在您的代码中:

在其他用户登录后/在您的代码中,可以使用以下步骤:

    roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all);

使用户状态在线:
    Presence presence = new Presence(Presence.Type.available);
            presence.setStatus("Online, Programmatically!");
            presence.setPriority(24);
            presence.setMode(Presence.Mode.available);
            roster = Roster.getInstanceFor(connection);

在调用createEntry()时,我遇到了空指针异常。 - Phoenix
可能存在花名册未正确初始化的情况。在我的情况下,我已经像上面那样初始化了,可以查看编辑后的答案。 - sanjay

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