XMPP aSmack – ¿Cómo puedo obtener el estado de usuario actual (offline / online / away / etc.)?

Soy nuevo en xmpp / asmack en android.

¿Puede alguien por favor ayudarme a conseguir la presencia de los amigos del usuario (lista de 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 aparece en mi lista.

Sólo tienes que usar esto:

 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 xmpp / asmack

Utilizar como este

 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 utiliza RosterListener, actualiza la presencia en tiempo real, funciona para mí muy bien.

 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 su método llamado dentro de él.

Como mi experiencia antes de que puedas ver el estado y otros de Presencia debes 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 necesita suscribirse al usuario B. después de que el usuario A pueda ver el usuario B Presencia.

Suscribirse 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); } 
  • Chat y aplicación VOIP
  • Cómo utilizar con eficacia XMPP persistente con android
  • Cómo saber Escribir Estado en XMPP openfire usando Smack
  • Xmpp + openfire + confirmación del servidor al remitente
  • No se puede recibir el archivo usando asmack y xmpp
  • Todos los idiomas excepto los literales ingleses analizados en la solicitud de GCM POST
  • SASLError utilizando PLAIN: no autorizado
  • No puede conectarse al servidor de Google Cloud Connection
  • MQTT vs. XMPP ¿Qué debo elegir?
  • Error en la autenticación SASL de Gtalk XMPP con el mecanismo X-OAUTH2?
  • Falló porque: de.measite.minidns.hla.ResolutionUnsuccessfulException: Solicitando xxxx. IN AAAA produjo una respuesta de error NX_DOMAIN
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.