2011-01-12 1 views
9

Могу ли я получить онлайн-пользователей в моем списке друзей через Smack API? Является ли это возможным?Могу ли я получить онлайн-пользователей в списке друзей через Smack?

Я работаю над приложением, у которого есть чат между пользователями. Я успешно создал пример приложения чата, просто введя имя друга и отправляю чат, но теперь я хочу онлайн-список друзей.

ответ

20
Roster roster = xmppConnection.getRoster(); 
Collection<RosterEntry> entries = roster.getEntries(); 
Presence presence; 

for(RosterEntry entry : entries) { 
    presence = roster.getPresence(entry.getUser()); 

    System.out.println(entry.getUser()); 
    System.out.println(presence.getType().name()); 
    System.out.println(presence.getStatus()); 
} 
+1

Спасибо, butin, на котором я могу определить статус онлайн или офлайн, может убрать это? –

+1

Я сделал тот же код, но каждый пользователь просто дает присутствие «недоступным», как это может быть, когда 4-5 уже доступны, но показывая мне, что все недоступны, может ли кто-нибудь помочь мне в этом? –

+2

То же самое здесь. Я просто получаю статус недоступным:/ –

1

Используйте метод presence.getMode(), чтобы получить режим Пользователя. Режим - это перечисление, и его значение может быть чатом, доступным, прочь, xa, dnd.

4
Presence presence = roster.getPresence("[email protected]"); 
if (presence.getType() == Presence.Type.AVAILABLE) { 
    // Tom is online... 
} 

справка из this link

+0

Мне нужно задать несколько вопросов относительно xmpp, я могу получить своих друзей-реестров в виде списка сейчас, я хочу показать только онлайн-пользователей в списке, что будет, пожалуйста, направьте меня –

+0

работает ли он на android lollipop? –

5
XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() { 

     @Override 
     public void connectionCreated(Connection arg0) { 
      Log.i(TAG, "receive xmpp connection : " + arg0); 
      connection = arg0; 
      roster = arg0.getRoster(); 

      Collection<RosterEntry> entries = roster.getEntries(); 
      Presence presence; 

      Log.e(TAG, "user count" + entries.size()); 

      for (RosterEntry entry : entries) { 
       presence = roster.getPresence(entry.getUser()); 

       Log.i(TAG, "" + entry.getUser()); 
       Log.i(TAG, "" + presence.getType().name()); 
       Log.i(TAG, "" + presence.getStatus()); 
      } 

     } 
    }); 

Так что в начале программы регистрации этого XMPPConnection слушателя, как правило, это займет несколько секунд, чтобы получить объект подключения. Но он будет работать только в том случае, если вы будете использовать creatEntry только в этом случае, когда петух увидит этих созданных пользователей.

Для записи с помощью создающего Roster использовать следующий код:

try { 
    rooster.createEntry("name", "user_id", null); 
} catch (XMPPException e) { 
    e.printStackTrace(); 
} 

я не использовал какую-либо группы, и с успехом видеть пользователь на втором устройстве.

1
smackAndroid = SmackAndroid.init(this); 
XMPPConnection.addConnectionCreationListener(new ConnectionCreationListener() { 

    @Override 
    public void connectionCreated(XMPPConnection connection) { 

      Log.i("hello", "receive xmpp connection : " + connection); 
      roster = connection.getRoster(); 

      try { 
       roster.createEntry("2868254", "hello", null); 
      } catch (XMPPException e) { 
       e.printStackTrace(); 
      } catch (NotLoggedInException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (NoResponseException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (NotConnectedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
}); 
+0

над моим кодом не извлекает он-лайн пользователя –

+0

Можете вы добавить некоторые объяснения к этому? – apaul