Reputation: 111
I am on last Steps of my Chat app, i'm trying to receive Notification whenever Messages are Delivered, so i found this implementation:
MessageEventRequestListener
which comes with 4 overrides:
@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");
}
but when a message is sent, nothing happened, i'm wondering am i missing any thing? is this the right approach ? thanks
Upvotes: 0
Views: 1346
Reputation: 786
First add these to your configuration-
DeliveryReceiptManager.setDefaultAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
ProviderManager.addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
ProviderManager.addExtensionProvider(DeliveryReceiptRequest.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceiptRequest.Provider());
Then after XMPPTcpConnection established add these-
DeliveryReceiptManager deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(this.connection);
deliveryReceiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
deliveryReceiptManager.autoAddDeliveryReceiptRequests();
This will enable delivery receipt for all messages.
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>
For auto receipt mode all message will be sent with a receipt request extension. And you will get delivery receipt for all messages.
Upvotes: 1
Reputation: 1785
use this code where you get packet of message. //checking is deliverd or not.
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);
}
Upvotes: 0
Reputation: 161
As @Flow said,XEP-22: Message events is deprecated.You can use DeliveryReceiptManager.
The listener invoked when message received at receiver side
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);
}
});
}
while sending message add following code
//add delivery receipt request
DeliveryReceiptManager.addDeliveryReceiptRequest(Message);
In PacketListener add following code
Packet received = new Message();
received.addExtension(new DeliveryReceipt(packet.getPacketID()));
received.setTo(packet.getFrom());
connection.sendPacket(received);
Upvotes: 3
Reputation: 24053
XEP-22: Message events is deprecated, I don't recommend using it. Use Delivery Receipts (XEP-0184) instead: https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/receipts/DeliveryReceiptManager.html
Upvotes: 1
Reputation: 2430
For each message you send, you may send notifications requests with :
MessageEventManager.addNotificationsRequests(message,
true, true, true, true);
Upvotes: 0