Xmpp + openfire + 服务器确认发送者

3

我正在开发即时通讯应用程序。

我希望在消息被Openfire服务器接收时得到确认。

我使用了以下Gradle:

//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,但它没有起作用。

如果有任何解决方法或建议,将不胜感激。


2
在成功连接之后,请添加以下代码:DeliveryReceiptManager.getInstanceFor(connection).enableAutoReceipts(); - Maddy
让我试试 @Maddy。 - Radhey
2个回答

1

最好为每个发送的消息附加一个公共监听器,并相应地更新您的数据库(因此更新您的用户界面)以使内容更易于理解。

为每个发送的消息定义一个随机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对象。

更新:在调用xmppTcpConnection对象的connect()之前尝试添加监听器。


我也遇到了消息跳过的问题!有什么解决方法吗? - Radhey
@Radhey,是的,当您在processStanza方法中收到回调时,这意味着特定消息已成功被服务器接收。 - Sarthak Mittal
@Radhey 信息跳过是什么意思? - Sarthak Mittal
当然,哪里? 顺便说一下,我已经更新了答案,只需添加导入语句,您就可以访问XMPPTCPConnection。 - Sarthak Mittal
1
谢谢@SarthakMittal,你帮我省了很多时间。 - Sathish Gadde
显示剩余7条评论

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);

正是我所需要的! - Radhey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接