Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 如何实现消息读取状态,如whatsapp蓝色刻度?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在开发一个应用程序,聊天是一个模块,聊天我正在使用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);

大佬总结

以上是大佬教程为你收集整理的android – 如何实现消息读取状态,如whatsapp蓝色刻度?全部内容,希望文章能够帮你解决android – 如何实现消息读取状态,如whatsapp蓝色刻度?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。