2013-08-13 2 views
0

Я использую asmack 8-0.8.3.XMPP asmack: контактное присутствие не работает для переходов на «доступно»

Я не получаю сообщения об изменениях Присутствия из моих контактов, когда они переходят на «доступные». Если один контакт переходит из «доступного» в «dnd», я получаю сообщение. Но не наоборот.

Contact passes: "available" --> "dnd" --> "available" --> "dnd" 
I receive:     Presence{dnd}    Presence{dnd} 

Принимаю во внимание, что я ожидаю получить обновление присутствия {available} между двумя dnd.

Поскольку я получаю обновления присутствия, кроме «доступных», я полагаю, что мой слушатель работает нормально. Также я полагаю, что я правильно подписался на присутствие моих контактов ...

private class FriendListener implements RosterListener { 

    public void entriesAdded(Collection<String> addresses) { } 
    public void entriesUpdated(Collection<String> addresses) { } 
    public void entriesDeleted(Collection<String> addresses) { } 

    public void presenceChanged(Presence presence) { 
     String fromUserID = StringUtils.parseBareAddress(presence.getFrom()); 
     System.out.println(
     "Presence changed: " + fromUserID + 
     " Presence=" + presence.toString() + 
     " Type=" + presence.getType().toString() + 
     " Mode=" + presence.getMode().toString() 
    ); 
     mainCallback_.updatePresenceFriend(fromUserID, presence); 
    } 
    } 

public void subscribe(String friendID, String friendName) { 
    Presence presence = new Presence(Presence.Type.subscribe); 
    connection.sendPacket(presence); 

    RosterPacket rosterPacket = new RosterPacket(); 
    rosterPacket.setType(IQ.Type.SET); 
    Item item = new Item(friendID, friendName); 
    item.setItemType(RosterPacket.ItemType.both); 
    rosterPacket.addRosterItem(item); 

    connection.sendPacket(rosterPacket); 
    System.out.println("Send subscribe to " + friendID); 

    subscribedUsers.add(friendID); 
} 

ответ

0

Я нашел проблему!

На самом деле там была ошибка в журнале моего Listener, эта линия:

System.out.println(
    "Presence changed: " + fromUserID + 
    " Presence=" + presence.toString() + 
    " Type=" + presence.getType().toString() + 
    " Mode=" + presence.getMode().toString() 
); 

Он сделал разбился при Presence.getMode() == NULL, так что я не обработал сообщение присутствия. Но в журналах ничего не показывалось, потому что слушатель находится в другом потоке ... Изменение журнала по следующей линии решило проблему

System.out.println(
    "Presence changed: " + fromUserID + 
    " Presence=" + presence.toString() 
);