【问题标题】:How to accept buddy request properly in Android smack?如何在 Android smack 中正确接受好友请求?
【发布时间】:2012-05-08 18:44:48
【问题描述】:

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

【问题讨论】:

    标签: java android xmpp smack asmack


    【解决方案1】:

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

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

    这就是它的工作原理:

    • 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 的名单中。用户 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
                  }
              }
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-03
      • 2020-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多