2014-01-30 49 views
4

我正在使用OpenFire和aSmack。交付收据请求不适用于XMPP Android(aSmack)

我似乎无法获得DeliveryReceipts的工作。

我做以下,当我创建一个连接:

//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))在下述发送回收据:

Packet received = new Message(); 
received.addExtension(new DeliveryReceipt(packet.getPacketID())); 
received.setTo(packet.getFrom()); 
getConnection().sendPacket(received); 

尽管如此,在接收端的客户端接收消息没问题,但侦听器不会在发送者的系统中被解雇。我错过了什么?

+0

检查如果服务器支持这个。 – 2014-01-30 15:40:52

+2

我不认为这是一个服务器相关的功能。只有客户需要实现这一点。 – Bam

+1

您是否确认收件人已发送收据?如果是这样,请使用调试器来跟踪收到的收据节的方式。 (a)Smack是开源的,因此您可以轻松调试代码。 – Flow

回答

10

在设置连接之前添加这些行,自动收据将与ReceiptReceivedListener一起使用。看起来像DeliveryReceipt扩展没有默认注册。

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

老兄对我来说,它在抛出NPE的同时在这些线上聊天connection.sendPacket(msg); –

+0

什么是NPE? – Bam

+0

我也正在NPE,你如何解决它? –

0

嗨上面说的答案给了我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. 

     } 


    }; 
+0

我在使用asmack从xmpp服务器发送和接收android设备上的消息时遇到问题,您可以通过此链接(http://chat.stackoverflow.com/rooms/68853/trying-to-learn)帮助我解决问题,谢谢 –

+0

可以请你告诉我在哪个文件中,我把这个代码来获得传递的消息状态@ sham.y – Sarbjyot

+0

@sarbjyot:抱歉,延迟响应。您需要将上面的代码放在初始化XMPPConnection对象的类中。如果您遇到任何问题,请告知我。 –