Первым делом первым делом.Если вы прочитаете это:
https://xmpp.org/extensions/xep-0162.html
, вы найдете это: subscription = 'both': вы и контакт заинтересованы в информации о присутствии друг друга.
Итакесли ваш список настроен на подписку = «оба», вы оба должны быть в другом списке (скажем, в друзьях и одобрении в обоих направлениях), чтобы слушать информацию о присутствии друг друга.
Итак, зная предыдущий,Я сделал это с помощью Smack:
//Created presence packet listener
private StanzaListener presencePacketListener;
//In my connection creating
private XMPPTCPConnection createConnection() throws XmppStringprepException {
XMPPTCPConnectionConfiguration.Builder config = XMPPTCPConnectionConfiguration.builder();
.......
config.setSendPresence(true);
.......
return new XMPPTCPConnection(config.build());
}
//Then in login method
public void login() throws SmackInvocationException, XmppStringprepException {
connect();
try {
//Add presencePacketListener to listen for subscribed users (Roster) presence
con.addSyncStanzaListener(presencePacketListener, new StanzaTypeFilter(Presence.class));
//Actual login
.....
onConnectionEstablished();
} catch(Exception e) {
throw exception;
}
}
// onConnectionEstablished method
private void onConnectionEstablished() {
if (state != State.CONNECTED) {
sendPacket(new Presence(Presence.Type.available));
}
}
При выполнении
sendPacket (new Presence (Presence.Type.available));
все пользователи вашей подписки будут получать этот пакет присутствия.Это будет обработано в
sencePacketListener
, который мы зарегистрировали ранее при входе в систему.
//PresencePacketListener
public class PresencePacketListener implements StanzaListener {
private Context context;
PresencePacketListener(Context context) {
this.context = context;
}
@Override
public void processStanza(Stanza packet) {
Presence presence = (Presence)packet;
Presence.Type presenceType = presence.getType();
//Do sth with presence
}
}