android - 如何实现像whatsapp blue tick mark这样的消息阅读状态?

标签 android xmpp smack asmack

我正在开发一个应用程序,因为聊天是一个模块,为了聊天我正在使用 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);
        }
});

但我需要表明该消息是用户已读或未读,就像 whatsApp 蓝色标记一样, 任何人都可以帮助我,我在这里感到震惊。如何实现此消息读取概念。

提前致谢。

最佳答案

创建自定义数据包扩展类

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

关于android - 如何实现像whatsapp blue tick mark这样的消息阅读状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28994590/

相关文章:

java - 在android上实现频闪(闪光灯闪烁)效果,以相同的频率闪烁

java - 用户的 XMPP 名册 getPresence 状态 (java)

mysql - 尝试在 ejabberd (17.07) 上的 android 设备上使用 smack api(4.2) 注册用户时出现错误

android - 在 android smack 4.1 中接收重复消息

java - 如何使用 EditText 和 RadioButtons(以及颜色集)顺利存储用户输入数据?

java - 在 Android 中检查特定字符串是否有多个startsWith前缀

android - Google API 的单独 key

XMPP strophe,获取存在名单

java - 除聊天文本外的 Smack 消息客户端

java - 如何注册设备 token 到smack 4.2?