我知道之前有人问过这个问题,但 mschonaker here 只给出了部分答复.在我的网站上,用户可以将人添加到他们的花名册中,然后好友必须接受并最终连接。第一人称(用户a)使用著名的roster.createEntry(jid, name, groups);
这有效并在他的花名册中添加了一个条目,但随后我对该怎么做感到有些困惑:
roster.createEntry(jid, name, groups);
但这不起作用,什么也没发生。我也尝试做
Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo(jid);
xMPPConnection.sendPacket(subscribed);
但也没有用。我敢肯定一定有一个好的和简单的方法来做到这一点,但到目前为止我还没有在任何地方找到它,一次尝试一件事让我很头疼。有谁知道正确的流程?提前致谢!
最佳答案
从 Smack 文档:
名册和状态使用基于权限的模型,其中用户必须先授予权限,然后才能将其添加到其他人的名册中。这通过确保只有经过批准的用户才能查看他们的在线状态信息来保护用户的隐私。因此,当您添加新的名册条目时,它将处于挂起状态,直到其他用户接受您的请求。
如果另一个用户请求在线状态订阅以便他们可以将您添加到他们的花名册中,您必须接受或拒绝该请求。 Smack 通过以下三种方式之一处理在线状态订阅请求:
Automatically accept all presence subscription requests.
Automatically reject all presence subscription requests.
Process presence subscription requests manually.
可以使用 Roster.setSubscriptionMode(Roster.SubscriptionMode) 方法设置模式。简单客户端通常使用其中一种自动订阅模式,而全功能客户端应该手动处理订阅请求,并让最终用户接受或拒绝每个请求。如果使用手动模式,则应注册一个 PacketListener 来监听具有 Presence.Type.subscribe 类型的 Presence 数据包。
所以,尝试将Roster的订阅模式设置为手动,然后实现PacketListener来监听Presence.Type.subscribe。收到数据包后,使用 Presence.Type.subscribed 创建一个新数据包并将其发送给发送方。
关于xmpp - smack- 在花名册中创建条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6651490/