Я создаю приложение для обмена мгновенными сообщениями на Android, используя библиотеку smack и openfire в качестве сервера, но я не могу реализовать функцию человека, с которым разговаривает текущий пользователь. например, когда пользователь читает сообщение или когда он начинает печатать. Есть ли способ добиться этого с помощью привкуса или другого?
Реализация статуса получателя (чтение или ввод) в приложении для обмена сообщениями с помощью smack - Android
Ответы (1)
Чтобы узнать, какой пользователь является текущим, вы должны реализовать свою собственную логику. Вы должны использовать 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
(идентификатор строфы), и вы должны сохранить каждый соответствующий 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