如何在订阅模式“两者”中添加名册

我正在使用smack 3.1.0,当我添加一个名册时,我无法获得“两者”的订阅。 谁能帮我? 下面是我的代码:

Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all); Roster roster = connection.getRoster(); roster.createEntry("buddy@test.com","me",null) 

代码执行后,我在openfire中观察到订阅是“到”

重写@ mschonaker的答案要更清楚一些。

两个用户都需要相互订阅接受他们收到的订阅请求。 我们称他们为爱丽丝和鲍勃。 Alice向Bob发送订阅请求:

 Presence subscribe = new Presence(Presence.Type.subscribe); subscribe.setTo('bob@example.com'); connection.sendPacket(subscribe); 

当Bob收到请求时,他批准了:

 Presence subscribed = new Presence(Presence.Type.subscribed); subscribed.setTo('alice@example.com'); connection.sendPacket(subscribed); 

Bob也可能对Alice的存在感兴趣,所以他订阅了她:

 Presence subscribe = new Presence(Presence.Type.subscribe); subscribe.setTo('alice@example.com'); connection.sendPacket(subscribe); 

Alice需要批准Bob的请求:

 Presence subscribed = new Presence(Presence.Type.subscribed); subscribed.setTo('bob@example.com'); connection.sendPacket(subscribed); 

RFC6121的3.1节是目前最佳参考方法。

两个用户都需要相互订阅。 通过发送在线订阅节。 在Smack中:

  Presence presence = new Presence(Presence.Type.subscribe); presence.setTo(jid); connection.sendPacket(presence); 

RFC6121的3.1节将为您提供语义细节。

好吧,我辛苦工作了几天,终于让事情奏效了。 谢谢你@Joe Hildebrand,你的答案让我走上正确的道路来解决这个问题。 我已经用手动订阅模式实现了它(即用户需要手动接受另一个用户的请求)。

如果用户尚未发送订阅或取消订阅,则服务器继续将订阅请求推送给用户(在重新登录时)。 因此,您可以做的是将传入的订阅请求本地保存在列表中,并将其显示为手动接受/拒绝的“朋友请求列表”。 如果您的应用程序重新启动(因此重新连接到服务器),服务器将再次推送订阅请求。

这是它的工作原理:

  • User1向User2发送订阅状态。
  • 名单条目在User1的名单中自动创建(但不在User2的名单中)。
  • User2从User1接收订阅请求。
  • User2将订阅的状态发送回User2(User2> User1订阅完成)。
  • User2检查User1是否在User2的名单中。 User1不在User2的名单中。 User2将订阅状态发送回User1。
  • 在User2的名单中自动创建名单条目。
  • User1从User2接收订阅状态。
  • User1检查User2是否在User1的名单中。 User2位于User1的名单中。 User1将订阅的状态发送回User2(User2> User1订阅完成)。

      final Presence newPresence = (Presence) packet; final Presence.Type presenceType = newPresence.getType(); final String fromId = newPresence.getFrom(); final RosterEntry newEntry = getRoster().getEntry(fromId); if (presenceType == Presence.Type.subscribe) { //from new user if (newEntry == null) { //save request locally for later accept/reject //later accept will send back a subscribe & subscribed presence to user with fromId //or accept immediately by sending back subscribe and unsubscribed right now } //from a user that previously accepted your request else { //send back subscribed presence to user with fromId } } 

如果您使用的是开放式服务器,您还可以使用用户服务插件 ,该插件将创建包含订阅的名册…

同样的问题我面对但我得到了解决方案如何订阅’两个’

您添加用户时,下面是向用户发送订阅

  Presence pres = new Presence(Presence.Type.subscribed); pres.setPriority(24); pres.setMode(Presence.Mode.available); pres.setTo(friendJid); RoosterConnection.getConnection().sendStanza(pres); 

和接收结束在连接类中的下面方法和presenceChanged是RosterListener的默认方法。

  @Override public void presenceChanged(Presence presence) { mBus.post(presence); try { Presence pres = new Presence(Presence.Type.subscribed); pres.setTo(presence.getFrom()); RoosterConnection.getConnection().sendStanza(pres); } catch (SmackException.NotConnectedException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } }