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

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


person Rahmat Ullah    schedule 06.12.2018    source источник


Ответы (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

person Mahdi Moqadasi    schedule 11.12.2018
comment
раньше это было возможно с XEP-0022: события сообщений, но сейчас это устарело. Вы можете создать строфу с собственным расширением и обнаружить его с другой стороны. - person Mahdi Moqadasi; 11.12.2018
comment
можешь привести пример - person Rahmat Ullah; 11.12.2018
comment
Если это вам поможет, примите мой ответ, поставив галочку напротив поля для голосования. : / - person Mahdi Moqadasi; 31.12.2018