XMPP aSmack – Как я могу получить текущее состояние пользователя (offline / online / away / etc.)?

Я новичок в xmpp / asmack в android.

Может ли кто-нибудь помочь мне в получении присутствия друзей пользователя (список реестров)

Я использую это:

Presence availability = roster.getPresence(user); Mode userMode = availability.getMode(); 

Что еще я должен сделать, чтобы получить статус доступности каждого пользователя, указанного в моем списке.

Solutions Collecting From Web of "XMPP aSmack – Как я могу получить текущее состояние пользователя (offline / online / away / etc.)?"

Просто используйте вот так:

 Presence availability = roster.getPresence(user); Mode userMode = availability.getMode(); retrieveState_mode(availability.getMode(),availability.isAvailable()); public static int retrieveState_mode(Mode userMode, boolean isOnline) { int userState = 0; /** 0 for offline, 1 for online, 2 for away,3 for busy*/ if(userMode == Mode.dnd) { userState = 3; } else if (userMode == Mode.away || userMode == Mode.xa) { userState = 2; } else if (isOnline) { userState = 1; } return userState; } 

Дайте мне знать, если у вас возникли проблемы с xmpp / asmack

Используйте это

 userFromServer = con.getRoster().getPresence(userID); userState = retrieveState(userFromServer.getMode(), userFromServer.isAvailable()); public int retrieveState(Mode userMode, boolean isOnline) { int userState = XmppFriend.OFFLINE; // default return value if (userMode == Mode.dnd) { userState = XmppFriend.BUSY; } else if (userMode == Mode.away || userMode == Mode.xa) { userState = XmppFriend.AWAY; } else if (isOnline) { userState = XmppFriend.ONLINE; } return userState; } 
  roster.addRosterListener(new RosterListener() { public void entriesAdded(Collection<String> param) {} public void entriesDeleted(Collection<String> addresses) { } public void entriesUpdated(Collection<String> addresses) { } public void presenceChanged(Presence presence) { String user = presence.getFrom(); Presence bestPresence = roster.getPresence(user); Log.d(TAG, "BestPresence: " + user + ": " + bestPresence); String[] temp = presence.getFrom().split("\\@"); Log.d(TAG, "Presence: " + temp[0] + "-" + presence.toString()); String status = presence.toString(); // ShowInfoDialog(temp[0]+"is "+status); for (int i = 0; i < friendslist.size(); i++) { if (temp[0].equalsIgnoreCase(friendslist.get(i).getName())) { friendslist.get(i).setStatus(status); Log.d(TAG, "kilepet/belepet " + friendslist.get(i).getName() + " - " + friendslist.get(i).getStatus()); // ShowInfoDialog(friendslist.get(i).getName()+"is "+status); Log.d(TAG, "WATERFAK"); } } } 

Если вы используете RosterListener, он обновляет присутствие в режиме реального времени, он отлично работает для меня.

 ConnectToServer(){ final ProgressDialog dialog = ProgressDialog.show(ChatWindowFragmentActivity.this, "Connecting...", "Please wait...", false); Thread t = new Thread(new Runnable() { @Override public void run() { // Object of XmppClient class XmppClient mXmppClient = new XmppClient(); /* * // Create a connection ConnectionConfiguration connConfig = * new ConnectionConfiguration(HOST, PORT); */ XMPPConnection connection = null; try { SmackAndroid.init(ChatWindowFragmentActivity.this); connection = mXmppClient.connectionToXmppServer(); } catch (XMPPException e) { // TODO Auto-generated catch block // setConnection(null, null); } try { mXmppClient.loginUser(connection, USERNAME, PASSWORD); Log.i("XMPPChatDemoActivity", "Logged in as" + connection.getUser()); // Set the status to available Presence presence = new Presence(Presence.Type.available); connection.sendPacket(presence); setConnection(connection); Roster roster = connection.getRoster(); /* Fetch USER availability */ switch (isUserAvailable(connection)){ case 0: imgAvailability.setBackgroundColor(Color.GRAY); break; case 1: imgAvailability.setBackgroundColor(Color.GREEN); break; case 2: imgAvailability.setBackgroundColor(Color.YELLOW); break; case 3: imgAvailability.setBackgroundColor(Color.RED); break; default: break; } Collection<RosterEntry> entries = roster.getEntries(); for (RosterEntry entry : entries) { Log.d("XMPPChatDemoActivity", "--------------------------------------"); Log.d("XMPPChatDemoActivity", "RosterEntry " + entry); Log.d("XMPPChatDemoActivity", "User: " + entry.getUser()); Log.d("XMPPChatDemoActivity", "Name: " + entry.getName()); Log.d("XMPPChatDemoActivity", "Status: " + entry.getStatus()); Log.d("XMPPChatDemoActivity", "Type: " + entry.getType()); Presence entryPresence = roster.getPresence(entry .getUser()); Log.d("XMPPChatDemoActivity", "Presence Status: " + entryPresence.getStatus()); Log.d("XMPPChatDemoActivity", "Presence Type: " + entryPresence.getType()); Presence.Type type = entryPresence.getType(); if (type == Presence.Type.available) Log.d("XMPPChatDemoActivity", "Presence AVAILABLE"); Log.d("XMPPChatDemoActivity", "Presence : " + entryPresence); } } catch (XMPPException e) { e.printStackTrace(); Log.e("XMPPChatDemoActivity", "Failed to log in as " + USERNAME); Log.e("XMPPChatDemoActivity", e.toString()); new ShowAlert(ChatWindowFragmentActivity.this,e.getMessage(), false).show( getSupportFragmentManager(), TAG); // setConnection(null, null); } dialog.dismiss(); } }); t.start(); dialog.show(); } 

И ваш метод вызвал внутри него.

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

Например: пользователь A хочет видеть статус и доступный статус от пользователя B, в этом случае пользователю A необходимо подписаться на пользователя B. после того, как пользователь A может видеть пользователя B Presence.

Подписаться на RSS

 try { roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual); String userName = responders.getUsers().get(i).getUsername(); roster.createEntry("userB@domain", userName, null); Presence pres = new Presence(Presence.Type.subscribe); pres.setFrom("userA@domain"); connection.sendStanza(pres); } catch (Exception e) { android.util.Log.e("tag", "unable to add contact: ", e); }