【问题标题】:smack message sent statussmack 消息发送状态
【发布时间】:2017-10-28 00:47:06
【问题描述】:

我正在使用 smack 和 openfire 在 android 中创建聊天应用程序。 对于消息状态,我在其他中传递和显示的消息没有问题 客户(仔细检查)。 我将向发件人发送一个简单的 json 消息,如下所示: {“交付”:timestapmp} 并解析它并仔细检查低于之前发送的时间戳的消息。 问题是关于发送状态(一次检查)。 当我发送消息时,服务器没有响应该消息已发送的任何内容。 是否可以在 smack 中发送带有来自服务器的回调的消息。 如果可能,是否可以在回调响应中发送时间服务器。 谢谢。

【问题讨论】:

  • 这是您使用的 smack 版本
  • 最新版本,4.2
  • 看我已经为你解答了
  • 请检查并告诉我

标签: android openfire smack


【解决方案1】:

据我所知,我已经掌握了这个接口:ReceiptReceivedListener,它位于smack 4.2

以下是我的实现方式:

private ReceiptReceivedListener receiptReceivedListener;

/**
 * get DeliveryReceiptManager
 *
 * @return
 */
private DeliveryReceiptManager getDeliveryReceiptManager() {
    if (deliveryReceiptManager == null && getConnection() != null) {
        deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(getConnection());
    }
    return deliveryReceiptManager;
}

添加监听器

getDeliveryReceiptManager().addReceiptReceivedListener(receiptReceivedListener);

收到回电

receiptReceivedListener = new ReceiptReceivedListener() {
    @Override
    public void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt) {
        //TODO : on recieved status of message delivery
    }
};

这肯定会帮助你

以下是 Smack 4.2 的界面以及完整的详细信息:

/**
 * Callback invoked when a new receipt got received.
 * <p>
 * {@code receiptId} correspondents to the message ID, which can be obtained with
 * {@link org.jivesoftware.smack.packet.Stanza#getStanzaId()}.
 * </p>
 * 
 * @param fromJid the jid that send this receipt
 * @param toJid the jid which received this receipt
 * @param receiptId the message ID of the stanza(/packet) which has been received and this receipt is for
 * @param receipt the receipt
 */
void onReceiptReceived(Jid fromJid, Jid toJid, String receiptId, Stanza receipt);

【讨论】:

  • 看来这是客户对客户,
  • 当消息发送时,我希望服务器响应
  • 这是什么意思:
  • 但我想知道服务器已收到消息,
  • 如果我的消息已发送,我如何收听服务器(如 whatsapp 中的一个滴答状态),或者如果有任何错误,我如何获得错误响应。
【解决方案2】:
private void acknowledgementFromServer(final Message message) throws StreamManagementException.StreamManagementNotEnabledException {
        if (connection != null && connection.isSmEnabled()) {
            connection.addStanzaIdAcknowledgedListener(message.getStanzaId(), new StanzaListener() {
                @Override
                public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {

                        MessageAsyncTask task = new MessageAsyncTask(packet.getStanzaId(), MSG_STATUS_SENT);
                        task.execute();

                }
            });
        }

嘿,你可以这样做......每次发送消息时调用方法,方法是将消息作为参数传递给上述方法

注意:应该启用流管理才能使其工作,可以如下完成:

DeliveryReceiptManager.setDefaultAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
        ProviderManager.addExtensionProvider(DeliveryReceipt.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceipt.Provider());
        ProviderManager.addExtensionProvider(DeliveryReceiptRequest.ELEMENT, DeliveryReceipt.NAMESPACE, new DeliveryReceiptRequest.Provider());

【讨论】:

  • 你能解释一下这是如何工作的,这样我也可以了解这个
  • 什么是MessageAsyncTask
  • 这是我将消息状态更新到 sqlite 的异步任务。更清楚地说,它只是为了处理响应,就像你可以在那个地方也有一个方法一样。如果你不这样做,MessageAsyncTask 是不相关的想要保存您的回复
  • 你能告诉我你是如何获得在数据包中传递的消息的状态>
  • 在这个方法@Override public void processStanza(Stanza packet)
猜你喜欢
  • 2011-05-31
  • 2013-08-27
  • 2019-01-30
  • 2019-11-06
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多