Отправить Message.Type.normal в smack XMPP android

Я создаю приложение для чата, используя Smack XMPP. Все работает хорошо, кроме отчетов о прочтении/доставке.

Вот как я отправляю отчет о доставке:

{
    Message message = new Message();
    message.setTo(chatMessage.getReceiver());
    message.setType(Message.Type.normal);
    message.setFrom(chatMessage.getSender());
    message.setStanzaId(chatMessage.getReceiver() + "_" + CommonMethods.getCurrentGMTTime(0));

    ChatMarker_File_XMPP_SERVER chatMarker_file_xmpp_server=new ChatMarker_File_XMPP_SERVER("received","urn:xmpp:chat-markers:0" , true);
    chatMarker_file_xmpp_server.setIdValue(chatMessage.getMsgid());
    message.addExtension(chatMarker_file_xmpp_server);
    Mychat = ChatManager.getInstanceFor(connection).createChat(
            message.getTo() + "@"
                    + context.getString(R.string.server),
            mMessageListener);
    try {
        if (connection.isAuthenticated()) {
            /********************************************************
             * ********    MESSAGE SEND     **********************
             ***/

           Mychat.sendMessage(message);

        } else {

            login();
        }
    } catch (SmackException.NotConnectedException e) {
        Log.e("xmpp.SendMessage()", "msg Not sent!-Not Connected!");

    } catch (Exception e) {
        Log.e("SendMessage()-Exception",
                "msg Not sent!" + e.getMessage());
    }

}

Но проблема в том, что Mychat.sendMessage(message); метод SendMessage делает это

 /**
     * Sends a message to the other chat participant. The thread ID, recipient,
     * and message type of the message will automatically set to those of this chat.
     *
     * @param message the message to send.
     * @throws NotConnectedException 
     */
    public void sendMessage(Message message) throws NotConnectedException {
        // Force the recipient, message type, and thread ID since the user elected
        // to send the message through this chat object.
        message.setTo(participant);
        message.setType(Message.Type.chat);
        message.setThread(threadID);
        chatManager.sendMessage(this, message);
    }

Теперь, хотя я явно устанавливаю «messageType» на «нормальный», но «sendMessage ()» снова преобразует его в Type.Chat.

Я проверил другие возможные методы и документы, чтобы каким-то образом отправить сообщение с Type normal, но ничего не нашел.

Спасибо


person Syeda Zunaira    schedule 14.06.2017    source источник


Ответы (1)


Почему вы не используете диспетчер квитанций о доставке ??

При отправке сообщения:

Message message = new Message();
String deliveryReceiptId = DeliveryReceiptRequest.addTo(message);
message.setType(Message.Type.chat);

И вы можете получить подтверждение доставки, как показано ниже.

DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedListener(new ReceiptReceivedListener() {
                    @Override
                    public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) {
                        //here receiptId will be same as deliveryReceiptId u sent above which means msg is delivered to recipient 
                    }
                });
            }

и если вы хотите, чтобы сообщение было отправлено на статус сервера, вы можете проверить мой ответ здесь: https://stackoverflow.com/a/44254615/6350239< /а>

а для реализации статуса чтения msg вам необходимо реализовать свою пользовательскую квитанцию ​​о прочтении, подобную этой /а>

person Moulesh    schedule 16.06.2017