【问题标题】:Receiving Delivery of Sent Messages in aSmack在 aSmack 中接收已发送消息的传递
【发布时间】:2014-06-25 17:17:06
【问题描述】:

我在我的聊天应用程序的最后一步,我试图在发送消息时接收通知,所以我找到了这个实现:

 MessageEventRequestListener

它带有 4 个覆盖:

 @Override
public void deliveredNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("delievered");

}


@Override
public void displayedNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("displaydelievered");

}


@Override
public void composingNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("composingdelievered");

}


@Override
public void offlineNotificationRequested(String from, String packetID,
    MessageEventManager messageEventManager) {
System.out.println("offlinedelievered");

}

但是当发送消息时,什么也没发生,我想知道我错过了什么吗?这是正确的方法吗?谢谢

【问题讨论】:

    标签: android xmpp asmack


    【解决方案1】:

    正如@Flow 所说,XEP-22:不推荐使用消息事件。您可以使用 DeliveryReceiptManager。

    接收方收到消息时调用的监听器

      DeliveryReceiptManager.getInstanceFor(connection).addReceiptReceivedListener(new ReceiptReceivedListener()
         {
     @Override
            public void onReceiptReceived(String arg0, String arg1, String arg2) {
                Log.i("Message Delivered  To=", arg0 + ", From =  " + arg1 + " , ID= " + arg2);
            }
        });
    }
    

    发送消息时添加以下代码

      //add delivery receipt request
    
        DeliveryReceiptManager.addDeliveryReceiptRequest(Message);
    

    在 PacketListener 中添加以下代码

    Packet received = new Message();
    
    received.addExtension(new DeliveryReceipt(packet.getPacketID())); 
    
    received.setTo(packet.getFrom());
    
    connection.sendPacket(received);
    

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      首先将这些添加到您的配置中-

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

      然后在XMPPTcpConnection建立后添加这些-

      DeliveryReceiptManager deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(this.connection);
      deliveryReceiptManager.setAutoReceiptMode(DeliveryReceiptManager.AutoReceiptMode.always);
      deliveryReceiptManager.autoAddDeliveryReceiptRequests();
      

      这将为所有邮件启用送达回执。

      SENT:
      <iq to='chat_host' id='o2huU-440' type='get'><query xmlns='http://jabber.org/protocol/disco#info'></query></iq>
      
      RECV:
      <iq from='chat_host'id='o2huU-440' to='userJID'type='result'><query xmlns='http://jabber.org/protocol/disco#info'> <feature var='urn:xmpp:receipts'/></query>
      

      对于自动回执模式,所有消息都将与回执请求扩展一起发送。您将获得所有邮件的送达回执。

      【讨论】:

        【解决方案4】:

        对于您发送的每条消息,您可以通过以下方式发送通知请求:

        
        
        
           MessageEventManager.addNotificationsRequests(message,
                                        true, true, true, true);
        

        【讨论】:

          【解决方案5】:

          使用此代码获取消息包。 //检查是否交付。

          if(msg.getBody().toString().equalsIgnoreCase("RecivedByReciver")){
          
          //do what you want after get notify. 
          
          }else{
          //do what you want if not delevery report message.
          Message message=new Message(ConnectionManager.parseBareAddress(msg.getFrom()),Message.Type.chat);
          message.addBody(null,"RecivedByReciver");
          Connection().sendPacket(message);
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-02-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-16
            相关资源
            最近更新 更多