【问题标题】:How can I make use of XMPP XEP-0184 "Message Delivery Receipts" with Smack?如何在 Smack 中使用 XMPP XEP-0184 "Message Delivery Receipts"?
【发布时间】:2013-06-26 13:39:13
【问题描述】:

嗨,有什么方法可以做 android xmpp 客户端,它将能够获得消息接收确认 (XEP-0184) 我读到 smack 中有 XEP-0184 但正常的 smack 不适用于 android(或者我可以' t 这样做)总是有 SASL 身份验证异常。

【问题讨论】:

    标签: xmpp smack


    【解决方案1】:

    Smack 通过SMACK-331 获得了对 XEP-0184 的支持。 Android下不能直接使用Smack

    您可以在DeliveryReceiptManager 的 javadoc 中阅读有关 Smack 的 XEP-0184 API 的更多信息。

    【讨论】:

    • 当我使用 asmack 时,我没有看到像 xabber 这样的程序的消息确认,我应该在 asmack 中启用 xep-0184 吗?如果我应该告诉我我怎么找不到它。
    • 我添加了一个 javadoc 链接
    • 现在它工作正常,但我不得不手动发送接收确认: Packet received = new Message();收到的.addExtension(新的DeliveryReceipt(packet.getPacketID()));收到的.setTo(packet.getFrom()); connection.sendPacket(收到);我真的不知道为什么,但 DeliveryReceiptManager 没有检测到 xml 交付回执请求中存在。 DeliveryReceiptManager.hasDeliveryReceiptRequest(packet) 返回 false。
    • 要启用收据的自动传输,您需要在连接登录后立即调用以下代码:DeliveryReceiptManager .getInstanceFor(mXMPPConnection) .enableAutoReceipts(); - 这也将确保创建了一个经理并绑定到连接。
    • 试试DeliveryReceiptManager.getInstanceFor(connection).autoAddDeliveryReceiptRequests();
    【解决方案2】:

    是的,这适用于普通 Smack。

    Gradle 依赖项

    compile "org.igniterealtime.smack:smack-android:4.1.0"
    compile "org.igniterealtime.smack:smack-tcp:4.1.0"
    compile "org.igniterealtime.smack:smack-extensions:4.1.0" // <-- XEP-0184 classes
    

    准备好 XMPPTCPConnection,即在你 connect() 之前连接一个处理程序,以便你收到一个交货收据

    DeliveryReceiptManager.getInstanceFor(mConnection).addReceiptReceivedListener(new ReceiptReceivedListener() {
            @Override
            public void onReceiptReceived(String fromJid, String toJid, String deliveryReceiptId, Stanza stanza) {
                Log.d(TAG, "onReceiptReceived: from: " + fromJid + " to: " + toJid + " deliveryReceiptId: " + deliveryReceiptId + " stanza: " + stanza);
            }
        }); 
    

    发送消息时,请确保包含 MessageReceiptRequest

    Chat chat;
    if (StringUtils.isNullOrEmpty(threadId)) {
        chat = getChatManager().createChat(to);
        Log.d(TAG, "sendMessage: no thread id so created Chat with id: " + chat.getThreadID());
    } else {
        chat = getChatManager().getThreadChat(threadId);
        Log.d(TAG, "sendMessage: thread id was used to continue this chat");
    }
    Message message = new Message(to);
    message.addBody("EN", messageText);
    String deliveryReceiptId = DeliveryReceiptRequest.addTo(message);
    chat.sendMessage(message);
    Log.d(TAG, "sendMessage: deliveryReceiptId for this message is: " + deliveryReceiptId);
    

    全部完成

    现在,您可以知道对方何时收到了发送的消息,因为在上面的 Chat.sendMessage(Message) 代码中获取的 deliveryReceiptId 将由之前设置的 onReceiptReceived 回调记录。

    【讨论】:

    • “发送消息时,确保包含 MessageReceiptRequest”不是必需的,因为您通过调用 autoAddDeliveryReceiptRequests() 启用了自动送达回执请求。
    • 通过删除多余的调用来修复:DeliveryReceiptManager.getInstanceFor(mConnection).autoAddDeliveryReceiptRequests();
    • 本可以删除多个 LOC,为什么还要删除一个?
    • 因为将投递请求显式添加到外发邮件会返回投递回执 ID。如果使用 autoAddDeliveryReceiptRequests 调用,则不清楚如何获得它;即 DeliveryReceiptRequest 扩展不会自动添加到消息中。
    • “即 DeliveryReceiptRequest 扩展不会自动添加到消息中。”不,autoAddDeliveryReceiptRequest() 正是这样做的:它会自动向每个传出消息节添加一个送达回执请求。然后你使用DeliveryReceiptManager.addReceiptReceivedListener(ReceiptReceivedListener) 来获取收到的收据的回调。
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2012-07-20
    • 2015-05-31
    • 1970-01-01
    • 2015-05-30
    • 2015-04-06
    • 1970-01-01
    相关资源
    最近更新 更多