有一个openfire服务器和Android客户端(smack)。所有客户端都可以互相添加到好友/名单列表中(未经授权,我希望用户可以在没有接受好友请求的情况下看到对方)。我在获取好友请求发送者的状态信息方面存在一些问题 假设有2个用户 - 用户A,用户B。
我可以通过以下方式将用户B添加到用户A的名单中:
Roster roster = xmppManager.connection.getRoster();
roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all);
roster.createEntry("userB", "userB@abc.com", null);
我可以在用户A的名单列表中看到用户B.到目前为止一切都很好
用户B几乎没有问题。我在下面的代码中说明了问题:
//I have set the available and status of User A by:
//xmppManager.setStatus(available, bundle.getString("new_status"));
...
// That's how I get Roster and Presence of user A
Roster roster = connection.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
for (RosterEntry entry : entries) {
Presence presence = roster.getPresence(entry.getUser());
// User A always not available even I set User A to available
Log.e(TAG, "presence.isAvailable() = " + presence.isAvailable());
// User A's status always empty
Log.e(TAG, "presence.getStatus() = " + presence.getStatus());
// User A's getName() always null
if (entry.getName() != null)
{
name = entry.getName();
}
else
Log.e(TAG, "GetName is null");
}
我需要在用户A创建创建()吗?
或者我是否需要对这样的好友请求做些什么?
@Override
public void entriesAdded(Collection<String> collection) {
String user = "";
Iterator<String> it = collection.iterator();
if(it.hasNext()){
user=it.next();
}
Presence presence = new Presence(Presence.Type.subscribe);
presence.setTo(user);
connection.sendPacket(presence);
}
但它不起作用。看来我需要先对用户B做一些事情。欢迎任何想法,谢谢!
答案 0 :(得分:2)
好的,我辛苦劳作了几天,终于让事情顺利进行了。我已经用手动订阅模式实现了它(即用户需要手动接受另一个用户的请求)。无需自己创建条目,因为服务器会根据发送/接收的状态自动处理此条目。
对于您的情况(自动订阅),只需立即发送订阅和订阅状态,而不是在本地保存请求。
这是它的工作原理:
User1检查User2是否在User1的名单中。 User2位于User1的名单中。 User1将订阅的状态发送回User2(User2&gt; 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
}
}