6

我知道之前有人问过这个问题,但 mschonaker在这里只给出了部分回复。在我的网站上,用户可以将人员添加到他们的名单中,然后好友必须接受,最后他们被连接。第一人称(用户 a)使用著名的

roster.createEntry(jid, name, groups);

这有效并在他的名单中添加了一个条目,但后来我对该怎么做有点困惑:

  • 我如何在另一端收到请求?我尝试实现一个 PacketListener,覆盖 processPacket() 并检查哪些类型是 Presence.Type.subscribe 或 Presence.Type.subscribed 的数据包,但它似乎只为用户 a 触发,而不是应该监听的那个订阅 - 用户 b。

  • 然后,我有另一个功能可以在登录时查找所有请求,所以如果我再次登录,我会看到请求,但我该如何接受呢?起初,我认为用户 b 也应该在他的名册中添加用户 a roster.createEntry(jid, name, groups);

但这没有用,什么也没有发生。我也尝试过

Presence subscribed = new Presence(Presence.Type.subscribed);
subscribed.setTo(jid);
xMPPConnection.sendPacket(subscribed);

但也没有用。我确信一定有一个好的简单的方法来做到这一点,但到目前为止我还没有在任何地方找到它,一次尝试一件事让我很头疼。有谁知道这个的正确流程?提前致谢!

4

1 回答 1

4

来自 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 创建一个新数据包并将其发送给发送者。

于 2011-07-13T14:21:32.417 回答