Чтобы узнать, какой пользователь является текущим, вы должны реализовать свой собственный в своей логике.Вы должны использовать Roster
(список контактов на серверах xmpp), чтобы получить контакты текущего пользователя и сохранить их в базе данных или где-то еще.Затем создайте активность, чтобы показать контакты в списке.Каждый контакт имеет уникальный jid
, который можно отличить от других с ним.Поэтому, нажав на каждый контакт, отправьте его объект (включая jid) в чат-активность.В чат-активности вы должны получать предыдущие сообщения из базы данных или MAM (заархивированные сообщения на сервере), и вы можете отправить сообщение текущему контакту (установите jid контакта как To
).
Для достижения доставки сообщения необходимо использовать эту ссылку .Вы можете задать запрос с этим кодом:
Message message = … //make your stanza
DeliveryReceiptRequest.addTo(message); //add delivery request to message
connection.sendStanza(message); //send message
, тогда вы можете быть уведомлены о доставке с этим кодом:
private void setDelRecListener() {
DeliveryReceiptManager d = DeliveryReceiptManager.getInstanceFor(connection);
d.addReceiptReceivedListener(new ReceiptReceivedListener() {
@Override
public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) {
Msg msg = F.getMsgBySid(receiptId);
if (msg == null)
return;
Boolean isUpdated = F.setMsgDelivered(msg);
Log.i("m/serv/UpdateDelivery", "for: " + receiptId + (isUpdated ? " Founded&Updated" : " NotFounded"));
if (isUpdated) {
BCTool.notifyPMDelivered(msg.id, msg.conv.frnd.getBareJid());
}
}
});
}
Имейте в виду, что у каждого строфа есть sid
(stanza id), и вы должны сохранить каждый соответствующий sid для модели сообщения в базе данных, когда отправка будет успешной.Таким образом, вы можете определить, какую доставку сообщений вы получили.- Для отправки состояний чата, таких как composing
, вы можете использовать этот метод:
public void sendChatState(String _jid, ChatState chatState) {
try {
Message msg = new Message();
msg.addExtension(new ChatStateExtension(chatState));
msg.setTo(JidCreate.bareFrom(_jid));
msg.setType(Message.Type.chat);
connection.sendStanza(msg);
Log.e("m/service", "ChatStateSent");
} catch (SmackException.NotConnectedException | InterruptedException | XmppStringprepException e) {
Log.e("m/service", "ChatState Not Sent: " + e.getMessage());
e.printStackTrace();
}
}
Вы должны установить таймер, чтобы предотвратить отправку composing
в следующие 5 секунд и сбросить таймер при вводе символа.Вы можете прочитать это: ChatStateNotifications