交付回执请求不适用于XMPP Android(aSmack)

交付回执请求不适用于XMPP Android(aSmack),android,xmpp,chat,asmack,Android,Xmpp,Chat,Asmack,我正在使用OpenFire和aSmack 我似乎无法让送货收据工作 创建连接时,我会执行以下操作: //create connection connection.login(username, password); DeliveryReceiptManager.getInstanceFor(connection).enableAutoReceipts(); DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedLi

我正在使用OpenFire和aSmack

我似乎无法让送货收据工作

创建连接时,我会执行以下操作:

//create connection
connection.login(username, password);
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);
        }
});
我正在使用以下方式向其他用户发送消息:

//send chat
Message msg = new Message(id, Message.Type.chat);
msg.setBody(chat);
DeliveryReceiptManager.addDeliveryReceiptRequest(msg);
connection.sendPacket(msg);
尽管消息是随ReceiptRequest一起发送的,但上述方法不起作用。尽管接收方收到消息,但侦听器不会在发送方端被激发。(我通过调试确认DeliveryReceiptRequest确实连接到发送的消息)

我还尝试通过在我的PacketListener中使用(MessageTypeFilter(Message.Type.chat)),手动发送回执:


尽管如此,接收端的客户端仍然可以接收消息,但侦听器在发送方的系统中不会被触发。我缺少什么?

在设置连接之前添加这些行,自动收据将与ReceiptReceivedListener一起使用。默认情况下,似乎未注册DeliveryReceive扩展

ProviderManager.getInstance().addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
ProviderManager.getInstance().addExtensionProvider(DeliveryReceiptRequest.ELEMENT, new DeliveryReceiptRequest().getNamespace(), new DeliveryReceiptRequest.Provider());

您好,上面的回答给了我NPE,所以我使用以下代码来获取消息通知,这对我来说非常适合: 别忘了添加此ProviderManager

  ProviderManager pm = ProviderManager.getInstance();
 pm.addExtensionProvider("x", "jabber:x:event",new MessageEventProvider()); 

MessageEventManager messageEventManager = new MessageEventManager(connection);
                        messageEventManager.addMessageEventNotificationListener(m_messageEventNotificationListener);
                        messageEventManager.addMessageEventRequestListener(m_DefaultMessageEventRequestListener);

/*
     * Notifies when message events happend
     * 
     */

    MessageEventNotificationListener m_messageEventNotificationListener = new MessageEventNotificationListener() {

        @Override
        public void deliveredNotification(String fromJID, String messageID) {
            final String _messageID =messageID;
            System.out.println("deliveredNotification");
            UiUtility.printMe("Message("+messageID+") Was Delivered to "+fromJID);
//WRITE YOUR CUSTOM METHOD WHEN MSG DELIVERED NOTFICATIONN RECIEVED.
        }

        @Override
        public void displayedNotification(String string, String string1) {

        }

        @Override
        public void composingNotification(String string, String string1) {


        }

        @Override
        public void offlineNotification(String string, String string1) {


        }

        @Override
        public void cancelledNotification(String string, String string1) {


        }

    };

    /*
     * Send a request when message events occured
     */

    DefaultMessageEventRequestListener m_DefaultMessageEventRequestListener = new DefaultMessageEventRequestListener() {

        @Override
        public void deliveredNotificationRequested(String from, String packetID, MessageEventManager messageEventManager) {
            super.deliveredNotificationRequested(from, packetID, messageEventManager); //To change body of generated methods, choose Tools | Templates.

        }


        @Override
        public void displayedNotificationRequested(String from, String packetID, MessageEventManager messageEventManager) {
            super.displayedNotificationRequested(from, packetID, messageEventManager); //To change body of generated methods, choose Tools | Templates.

        }

        @Override
        public void offlineNotificationRequested(String from, String packetID, MessageEventManager messageEventManager) {
            super.offlineNotificationRequested(from, packetID, messageEventManager); //To change body of generated methods, choose Tools | Templates.

        }

        @Override
        public void composingNotificationRequested(String from, String packetID, MessageEventManager messageEventManager) {
            super.composingNotificationRequested(from, packetID, messageEventManager); //To change body of generated methods, choose Tools | Templates.

        }


    };

虽然有点晚了,但这会对某些人有所帮助,请注意

receiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
检查以下代码:

DeliveryReceiptManager receiptManager = DeliveryReceiptManager.getInstanceFor(connection);

        //automatically enable delivery receipts to every message
        receiptManager.autoAddDeliveryReceiptRequests();
        receiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
        receiptManager.addReceiptReceivedListener(new ReceiptReceivedListener() {
            @Override
            public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) {

                //handle delivery receipts here
            }
        });

检查服务器是否支持此功能。我认为这不是与服务器相关的功能。只有客户端需要执行此操作。您是否验证收件人是否发送了收据?如果是这样,请使用调试器跟踪收到的接收节的方式。(a) Smack是开源的,因此您可以轻松调试代码。当接收者在my PacketListener中接收到消息时,消息没有附加任何接收扩展。这就是为什么我认为收件人没有寄回收据。我是否应该在邮件到达的地方检查传入的回执(即筛选类型为message.type.chat的my PacketListener)?调试表明接收方确实收到了请求并发回回执,而发送方收到了回执。但是发送方端的ReceiptReceivedListener没有捕获它。在连接成功登录之后,我正在ASyncTask中添加ReceiptReceivedListener。我应该在其他地方写这篇文章吗?老兄,对我来说,在这些线路连接中聊天时,它会抛出NPE@真是太棒了!NPE=Null指针异常DeliveryReceiptManager.getInstanceFor(连接)给我NullPointerException!!!您好@Navya Ramesan请查看我下面的答案,这将对您有所帮助。我也遇到了同样的问题,用我的方法摆脱了NPE。我在android设备上使用asmack从xmpp服务器发送和接收消息时遇到了一个问题,你能过来帮我解决这个问题吗,谢谢,请告诉我,我将代码放在哪个文件中,以获得交付的mesage status@sham。y@sarbjyot:很抱歉延迟回复。您需要将上述代码放在初始化XMPPConnection对象的类中。如果你遇到任何问题,请告诉我。谢谢@sham.y。LMC然后我将回复您;-)
DeliveryReceiptManager receiptManager = DeliveryReceiptManager.getInstanceFor(connection);

        //automatically enable delivery receipts to every message
        receiptManager.autoAddDeliveryReceiptRequests();
        receiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
        receiptManager.addReceiptReceivedListener(new ReceiptReceivedListener() {
            @Override
            public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) {

                //handle delivery receipts here
            }
        });