我正在开发一个应用程序,聊天是一个模块,聊天我正在使用xmpp.当我发送消息时,我使用DeliveryReceiptManager获取该消息传递状态.
DeliveryReceiptManager.getInstanceFor(connection).enableAutoReceipts(); DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedListener(new ReceiptReceivedListener() { @Override public void onReceiptReceived(String arg0,String arg1,String arg2) { Log.v("app",arg0 + "," + arg1 + "," + arg2); } });
但我需要表明该消息是用户READ或NOT whatsApp蓝色tickmark,
任何人都可以帮助我,我被击中了.如何实现此消息读取概念.
提前致谢.
解决方法
创建自定义数据包扩展类
public class ReadReceipt implements PacketExtension { public static final String NAMESPACE = "urn:xmpp:read"; public static final String ELEMENT = "read"; private String id; /// original ID of the delivered message public ReadReceipt(String id) { this.id = id; } public String getId() { return id; } @Override public String getElementName() { return ELEMENT; } @Override public String getNamespace() { return NAMESPACE; } @Override public String toXML() { return "<read xmlns='" + NAMESPACE + "' id='" + id + "'/>"; } public static class Provider extends EmbeddedExtensionProvider { @Override protected PacketExtension createReturnExtension(String currentElement,String currentNamespace,Map<String,String> attributeMap,List<? extends PacketExtension> content) { return new ReadReceipt(attributeMap.get("id")); } } }
当进入聊天列表时发送具有相同包ID的消息标签
Message message = new Message(userJid); ReadReceipt read = new ReadReceipt(messagePacketID); message.addExtension(read); mConnection.sendPacket(sendReadStatus);
其中mConnection是xmmppConnection对象
将数据包扩展添加到消息对象
在连接到服务器之前,将此扩展提供程序添加到ProviderManager
ProviderManager.getInstance().addExtensionProvider(ReadReceipt.ELEMENT,ReadReceipt.NAMESPACE,new ReadReceipt.Provider());
创建packetListener类以从接收器接收读取收据
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); } }
最后添加监听器到你的xmpp连接对象,它成功地工作
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);