我正在使用smack 3.1.0,当我添加一个名册时,我无法获得“两者”的订阅。谁能帮我? 下面是我的代码:
Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.accept_all);
Roster roster = connection.getRoster();
roster.createEntry("buddy@test.com","me",null)
代码执行后,我在openfire中观察到订阅是“to”
答案 0 :(得分:40)
重写@ 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);
鲍勃也可能对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);
Section 3.1 of RFC6121是目前最佳参考方式。
答案 1 :(得分:10)
两个用户都需要相互订阅。通过发送在线订阅节。在Smack:
Presence presence = new Presence(Presence.Type.subscribe);
presence.setTo(jid);
connection.sendPacket(presence);
Section 3.1 of the RFC6121会为您提供语义细节。
答案 2 :(得分:2)
好的,我辛苦劳作了几天,终于让事情顺利进行了。谢谢@Joe Hildebrand,你的回答让我走上正确的道路来解决这个问题。我已经用手动订阅模式实现了它(即用户需要手动接受另一个用户的请求)。
如果用户尚未发送订阅或取消订阅,服务器会继续向用户推送订阅请求(重新登录时)。因此,您可以做的是将传入的订阅请求本地保存在列表中,并将其显示为手动接受/拒绝的“朋友请求列表”。如果您的应用程序重新启动(因此重新连接到服务器),服务器将再次推送订阅请求。
这是它的工作原理:
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
}
}
答案 3 :(得分:1)
如果您使用的是开放式服务器,您还可以使用User Service plugin来创建包含订阅的名单......
答案 4 :(得分:1)
同样的问题我面对但是我得到了如何订阅'两个'的解决方案
以下是添加用户时向用户发送订阅
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();
}
}