#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);
}