我正在开发IM应用程序。 我希望在
时得到确认当Openfire服务器收到消息时
我使用了以下渐变
//XMPP Gradles
compile 'org.igniterealtime.smack:smack-android:4.1.0'
compile 'org.igniterealtime.smack:smack-tcp:4.1.0'
compile 'org.igniterealtime.smack:smack-im:4.1.0'
compile 'org.igniterealtime.smack:smack-extensions:4.1.0'
注意:我已经浏览过每一个StackOverflow链接,并得出结论:Openfire不支持 XEP-0184 ,它描述了交付仅收据。
我还尝试了 DeliveryReceiptManager 并设置了 addReceiptReceivedListener ,但它无效。
任何变通办法或建议都将受到赞赏。
答案 0 :(得分:0)
最好将公共侦听器附加到每个已发送的消息,并相应地更新数据库(以及您的UI)。
为每个外发邮件定义随机UUID:
String stanzaId = UUID.randomUUID().toString()
将听众附加到您的讯息中:
xmppTcpConnection.addStanzaIdAcknowledgedListener(stanzaId , new StanzaListener()
{
@Override
public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException
{
// You can match your stanzaId here!
// packet.getStanzaId()
}
});
添加:
compile "org.igniterealtime.smack:smack-tcp:4.2.0"
获取XMPPTCPConnection
对象。
更新:在connect()
对象上调用xmppTcpConnection
之前尝试添加侦听器。
答案 1 :(得分:0)
发送邮件附件DeliveryReceiptRequest.addTo(msg);
Message msg = new Message(oppositeUserId, Message.Type.chat);
msg.setBody(mMessageBody);
msg.setStanzaId(messageId);
msg.setFrom(loginUserId);
DeliveryReceiptRequest.addTo(msg);
mXMPPTCPConnection.sendStanza(msg);
XmppDeliveryReceiptManager.java
public class XmppDeliveryReceiptManager implements ReceiptReceivedListener {
private static final String TAG = XmppDeliveryReceiptManager.class.getSimpleName();
Context mContext;
public XmppDeliveryReceiptManager(Context mContext) {
this.mContext = mContext;
Log.d(TAG, "XmppDeliveryReceiptManager : initialized ");
}
@Override
public void onReceiptReceived(String fromJid, String toJid, String receiptId, Stanza receipt) {
Log.d(TAG, "onReceiptReceived : receiptId = " + receiptId);
// do need full with "receiptId"
}
}
将此添加到您的XMPP配置
/* Add XMPP DeliveryReceiptManager */
ProviderManager.addExtensionProvider(DeliveryReceipt.ELEMENT,
DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
ProviderManager.addExtensionProvider(DeliveryReceiptRequest.ELEMENT,
new DeliveryReceiptRequest().getNamespace(), new DeliveryReceiptRequest.Provider());
mXmppDeliveryReceiptManager = new XmppDeliveryReceiptManager(mContext);
mDeliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(mXMPPTCPConnection);
mDeliveryReceiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
mDeliveryReceiptManager.addReceiptReceivedListener(mXmppDeliveryReceiptManager);