gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:57 25 4
gpt4 key购买 nike

有一个 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 做点什么。欢迎任何想法,谢谢!

最佳答案

好的,我为此努力工作了几天,终于可以正常工作了。我已经用手动订阅模式实现了它(即用户需要手动接受另一个用户的请求)。无需自己创建条目,因为服务器会根据发送/接收的状态自动处理。

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

它是这样工作的:

  • 用户 1 向用户 2 发送订阅状态。
  • 名册条目会在 User1 的名册中自动创建(但不会在 User2 的名册中创建)。
  • 用户 2 收到用户 1 的订阅请求。
  • 用户 2 向用户 2 发回订阅状态(用户 2 > 用户 1 订阅完成)。
  • 用户 2 检查用户 1 是否在用户 2 的花名册中。 User1 不在 User2 的花名册中。用户 2 向用户 1 发回订阅状态。
  • 在 User2 的名册中自动创建名册条目。
  • 用户 1 收到用户 2 的订阅状态。
  • 用户 1 检查用户 2 是否在用户 1 的花名册中。 User2 在 User1 的花名册中。用户 1 向用户 2 发回订阅状态(用户 2 > 用户 1 订阅完成)。

            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
    }
    }

关于java - 如何在 Android smack 中正确接受好友请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10360447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com