android xmpp smack asmack

android - XMPP aSmack: ¿Cómo puedo obtener el estado actual del usuario(fuera de línea/en línea/fuera/etc.)?



(5)

Soy nuevo en xmpp / asmack en Android.

¿Alguien puede ayudarme a obtener la presencia de los amigos del usuario (lista de la lista)?

Estoy usando esto:

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

¿Qué más debo hacer para obtener el estado de disponibilidad de cada usuario que figura en mi lista?


Según mi experiencia anterior, puede ver el estado y otros de Presencia que necesita para suscribir al usuario.

por ejemplo: el usuario A desea ver el estado y el estado disponible del usuario B, en este caso, el usuario A debe suscribir al usuario B. después de que el usuario A pueda ver la presencia del usuario B.

Suscribir Código

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); }


Solo usa así:

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; }

Avísame si tienes algún problema con respecto a xmpp / asmack


usar así

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"); } } }

Si usa RosterListener, actualiza la presencia en tiempo real, funciona bien para mí.


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(); }

Y tu método llamado dentro de él.