java smack_java – 如何在Android smack中正确接受好友请求?

有一个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 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 collection) {

String user = "";

Iterator it = collection.iterator();

if(it.hasNext()){

user=it.next();

}

Presence presence = new Presence(Presence.Type.subscribe);

presence.setTo(user);

connection.sendPacket(presence);

}

但它不起作用.看来我需要先对用户B做一些事情.欢迎任何想法,谢谢!

最佳答案 好吧,我辛苦工作了几天,终于让事情顺利进行.我已经用手动订阅模式实现了它(即用户需要手动接受另一个用户的请求).无需自己创建条目,因为服务器会根据发送/接收的状态自动处理此条目.

对于您的情况(自动订阅),只需立即发送订阅和订阅状态,而不是在本地保存请求.

这是它的工作原理:

> 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

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值