Получение доставки отправленных сообщений в aSmack

#android #xmpp #asmack

#Android #xmpp #asmack

Вопрос:

Я нахожусь на последних этапах моего приложения для чата, я пытаюсь получать уведомления всякий раз, когда сообщения доставляются, поэтому я нашел эту реализацию:

  MessageEventRequestListener
 

который поставляется с 4 переопределениями:

  @Override
public void deliveredNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("delievered");

}


@Override
public void displayedNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("displaydelievered");

}


@Override
public void composingNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("composingdelievered");

}


@Override
public void offlineNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("offlinedelievered");

}
 

но когда сообщение отправляется, ничего не произошло, мне интересно, я что-то пропустил? это правильный подход? Спасибо

Ответ №1:

Как сказал @Flow, XEP-22: события сообщений устарели.Вы можете использовать DeliveryReceiptManager.

Прослушиватель вызывается при получении сообщения на стороне получателя

   DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedListener(new ReceiptReceivedListener()
     {
 @Override
        public void onReceiptReceived(String arg0, String arg1, String arg2) {
            Log.i("Message Delivered  To=", arg0   ", From =  "   arg1   " , ID= "   arg2);
        }
    });
}
 

при отправке сообщения добавьте следующий код

   //add delivery receipt request

    DeliveryReceiptManager.addDeliveryReceiptRequest(Message);
 

В PacketListener добавьте следующий код

 Packet received = new Message();

received.addExtension(new DeliveryReceipt(packet.getPacketID())); 

received.setTo(packet.getFrom());

connection.sendPacket(received);
 

Ответ №2:

XEP-22: события сообщений устарели, я не рекомендую его использовать. Вместо этого используйте квитанции о доставке (XEP-0184): https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/receipts/DeliveryReceiptManager.html

Ответ №3:

Сначала добавьте их в свою конфигурацию-

 DeliveryReceiptManager.setDefaultAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
ProviderManager.addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
ProviderManager.addExtensionProvider(DeliveryReceiptRequest.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceiptRequest.Provider());
 

Затем после установления XMPPTcpConnection добавьте эти-

 DeliveryReceiptManager deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(this.connection);
deliveryReceiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
deliveryReceiptManager.autoAddDeliveryReceiptRequests();
 

Это позволит получить квитанцию о доставке для всех сообщений.

 SENT:
<iq to='chat_host' id='o2huU-440' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq>

RECV:
<iq from='chat_host'id='o2huU-440' to='userJID'type='result'><query xmlns='http://jabber.org/protocol/disco#info'> <feature var='urn:xmpp:receipts'/></query>
 

В режиме автоматического получения все сообщения будут отправляться с расширением запроса на получение. И вы получите квитанцию о доставке для всех сообщений.

Ответ №4:

Для каждого отправляемого вами сообщения вы можете отправлять запросы на уведомления с :

 

   MessageEventManager.addNotificationsRequests(message,
                                true, true, true, true);


 

Ответ №5:

используйте этот код, где вы получаете пакет сообщений. // проверка доставлена или нет.

 if(msg.getBody().toString().equalsIgnoreCase("RecivedByReciver")){

//do what you want after get notify. 

}else{
//do what you want if not delevery report message.
Message message=new Message(ConnectionManager.parseBareAddress(msg.getFrom()),Message.Type.chat);
message.addBody(null,"RecivedByReciver");
Connection().sendPacket(message);

}