Реализация статуса получателя (чтение или ввод) в приложении обмена сообщениями с помощью smack - Android - PullRequest
0 голосов
/ 06 декабря 2018

Я создаю приложение для обмена мгновенными сообщениями в Android с использованием библиотеки smack и openfire в качестве сервера, но не могу реализовать функцию человека, с которым общается текущий пользователь.то есть когда пользователь читает сообщение или начинает печатать.Есть ли способ добиться этого с помощью smack или другого?

1 Ответ

0 голосов
/ 11 декабря 2018

Чтобы узнать, какой пользователь является текущим, вы должны реализовать свой собственный в своей логике.Вы должны использовать 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

...