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.