create your own package extension class
public class ReadReceipt implements PacketExtension { public static final String NAMESPACE = "urn:xmpp:read"; public static final String ELEMENT = "read"; private String id;
when entering a chat message, send a message tag with the same packet identifier as this
Message message = new Message(userJid); ReadReceipt read = new ReadReceipt(messagePacketID); message.addExtension(read); mConnection.sendPacket(sendReadStatus);
where mConnection is an xmmppConnection object
add package extension to message object
add this extension provider to the ProviderManager before connecting to the server
ProviderManager.getInstance().addExtensionProvider(ReadReceipt.ELEMENT, ReadReceipt.NAMESPACE, new ReadReceipt.Provider());
create a packetListener class to receive confirmation from the recipient
public class ReadReceiptManager implements PacketListener { private static Map<Connection, ReadReceiptManager> instances = Collections.synchronizedMap(new WeakHashMap<Connection, ReadReceiptManager>()); static { Connection.addConnectionCreationListener(new ConnectionCreationListener() { public void connectionCreated(Connection connection) { getInstanceFor(connection); } }); } private Set<ReceiptReceivedListener> receiptReceivedListeners = Collections.synchronizedSet(new HashSet<ReceiptReceivedListener>()); private ReadReceiptManager(Connection connection) { ServiceDiscoveryManager sdm = ServiceDiscoveryManager.getInstanceFor(connection); sdm.addFeature(ReadReceipt.NAMESPACE); instances.put(connection, this); connection.addPacketListener(this, new PacketExtensionFilter(ReadReceipt.NAMESPACE)); } public static synchronized ReadReceiptManager getInstanceFor(Connection connection) { ReadReceiptManager receiptManager = instances.get(connection); if (receiptManager == null) { receiptManager = new ReadReceiptManager(connection); } return receiptManager; } @Override public void processPacket(Packet packet) { ReadReceipt dr = (ReadReceipt)packet.getExtension(ReadReceipt.ELEMENT, ReadReceipt.NAMESPACE); if (dr != null) { for (ReceiptReceivedListener l : receiptReceivedListeners) { l.onReceiptReceived(packet.getFrom(), packet.getTo(), dr.getId()); } } } public void addReadReceivedListener(ReceiptReceivedListener listener) { receiptReceivedListeners.add(listener); } public void removeRemoveReceivedListener(ReceiptReceivedListener listener) { receiptReceivedListeners.remove(listener); } }
finally add a listener to your xmpp connection object, it works successfully
ReadReceiptReceivedListener readListener = new ReadReceiptReceivedListener() { @Override public void onReceiptReceived(String fromJid, String toJid, String packetId) { Log.i("Read", "Message Read Successfully"); } }; ReadReceiptManager.getInstanceFor(connection).addReadReceivedListener(readListener);