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)
- Cómo obtener la misma conexión xmpp de una actividad a otra?
- Smack en Android, obteniendo el código de error = "404" servidor remoto no encontrado al enviar paquetes / mensaje entre dos usuarios a través del servidor local Openfire
- Cómo implementar XMPP para enviar notificaciones push
- XMPP, WebSocket y otras preguntas
- Inhibición de inicio de sesión La autenticación SASL falló al utilizar el mecanismo DIGEST-MD5 asmack en android
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.
- Cómo enviar el dispositivo a la notificación del dispositivo usando FCM sin usar XMPP o cualquier otro script.
- ¿Cómo autenticarse en Google Talk con el token de autenticación de AccountManager utilizando la API de Smack?
- Límite de mensajería en la nube de Google
- (A) IQ.toXml () de Smack devuelve XML sin elementos secundarios personalizados
- Creación de un servidor xmpp para google google anterior
- Carga de Vcards con Smack (Android) en Openfire Server
- Obtener XMPP Open Fire Historial de mensajes privados y archivado de mensajes en Android
- Las solicitudes de recibo de entrega no funcionan para XMPP Android (aSmack)
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); }
- Android Honeycomb: NetworkOnMainThreadException incluso cuando se utiliza AsyncTask y no modo estricto?
- Hacer que la actividad de Android aparezca como diálogo