交付回执请求不适用于XMPP Android(aSmack)
我正在使用OpenFire和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
//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
}
});