2012-04-28 3 views
4

Существует сервер openfire и клиенты Android (smack). Все клиенты могут добавлять друг друга в список друзей/списков (без авторизации, я хочу, чтобы пользователь мог видеть друг друга без запроса собеседника). У меня есть некоторые проблемы с получением информации о присутствии отправителя отправителя.
Предположим, есть 2 пользователей - Пользователь A, Пользователь B.Как правильно принять запрос собеседника в Android?

Я могу добавить пользователя B к реестру пользователя А по:

Roster roster = xmppManager.connection.getRoster(); 
roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all); 
roster.createEntry("userB", "[email protected]", null); 

Я могу видеть пользователя 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"); 

} 

Нужно ли мне createEntry() на пользователя А?
Или мне нужно что-то сделать с запросом собеседника вроде этого?

@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. Любая идея приветствуется, спасибо!

ответ

2

Хорошо, я напряженно трудился над этим в течение нескольких дней и, наконец, начал работать. Я реализовал его в режиме ручной подписки (т. Е. Пользователю необходимо принять запрос другого пользователя вручную). Нет необходимости создавать записи самостоятельно, так как сервер обрабатывает это автоматически в зависимости от присутствий, отправленных/полученных.

Для вашего случая (автоматическая подписка) просто отправьте подписку и подписанное присутствие немедленно вместо сохранения запроса локально.

Вот как это работает:

  • User1 посылает подписываться присутствие Пользователю2.
  • Запись реестров автоматически создается в реестре User1 (но не в реестре User2).
  • Пользователь2 получает запрос на подписку от User1.
  • Пользователь2 отправляет подписку на подписку на User2 (User2> User1 complete complete).
  • User2 проверяет, является ли User1 в реестре User2. Пользователь1 не входит в список User2. Пользователь2 отправляет обратно подписку на User1.
  • Запись реестров автоматически создается в реестре User2.
  • Пользователь1 получает подписное присутствие от User2.
  • User1 проверяет, является ли User2 в реестре пользователя1. User2 находится в списке User1. Пользователь1 отправляет обратно подписанное присутствие на подписку 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 
          } 
         }