如何实现延迟交付 (XEP-203) 啪啪啪



我知道DelayInformationManager类,我知道这是实现这一目标的类。但是,我不知道如何使用它,如何指定Jid目的地,如何实际发送等等。

谁能给我一个简短的例子来演示它的用法?

使用以下内容,您可以使用 smack lib 实现Delayed Delivery

发送延迟送达收据

 public void sendReceipt(String toJID, String sender, final String stanzaID, final String id, final long millis, Message.Type msgType) {
    if(isConnected()){
        Message ack = null; //2017-11-17T15:21:50.063+00:00
        try {              
            String fromJidGroup = toJID;
            if(msgType == Message.Type.groupchat){
                fromJidGroup = ActivityHelper.createJid(sender) ;
            }else{
                fromJidGroup = toJID;
            }
           ack = new Message(JidCreate.from(fromJidGroup), Message.Type.chat); //msgType
           ack.addExtension(new DeliveryReceipt(id));

        } catch (XmppStringprepException e) {
            e.printStackTrace();
        }
        if(millis!=0) {
            DelayInformation delay = new DelayInformation(new Date(millis));
            ack.addExtension(delay);
        }
        if(stanzaID!=null){
            ack.setStanzaId(stanzaID);
        }
        try {
            if(connection.isSmEnabled() && connection!=null) {
                    //addStanzaIdAcknowledgedListener send successfully Receipt or not in server
                    connection.addStanzaIdAcknowledgedListener(ack.getStanzaId(), new StanzaListener() {
                        @Override
                        public void processPacket(Stanza stanza) throws SmackException.NotConnectedException, InterruptedException {
                            if(registerXmppListener!=null){
                                registerXmppListener.onStanzaIdAcknowledgedReceived(stanza);
                            }
                        }
                    });
            }
            connection.sendStanza(ack);
        } catch (SmackException.NotConnectedException e) {
            e.printStackTrace();
        } catch (InterruptedException | StreamManagementException.StreamManagementNotEnabledException e) {
            e.printStackTrace();
        }
    }
}

接收Delayed Delivery,首先用xmpp连接注册ReceiptReceivedListener

 private ReceiptReceivedListener mReceiptReceivedListener;
  mReceiptReceivedListener = new ReceiptReceivedListener() {
        @Override
        public void onReceiptReceived(Jid from, Jid to, String rec_id, Stanza stanza) {
            if(registerXmppListener!=null) {
                Log.d("onReceipt","onReceipt stanza : " + stanza.toXML());
                registerXmppListener.onDeliveryStatusReceived(from.toString(),to.toString(),rec_id,stanza);
            }
        }
    };
    mDeliveryReceiptManager.addReceiptReceivedListener(mReceiptReceivedListener);

onDeliveryStatusReceived侦听器

public void changeMessageDeliveryStatus(String from, String to, String rec_id, Stanza stanza){
    if(stanza instanceof Message) {
        Message msg = (Message) stanza;
        String jid = "";
        if(msg.getType().equals(Message.Type.chat)){
            jid = ActivityHelper.getBareJID(from);
        }else if(msg.getType().equals(Message.Type.groupchat)){
            jid = ActivityHelper.getSenderFromGroup(from);
        }
        String sender="";
        long date = System.currentTimeMillis();
        String stanza_id=stanza.getStanzaId();
        int chat_type = 0;
        int isPrivate = ChatConstants.ISPRIVATE_NO;
        DelayInformation timestamp = (DelayInformation)msg.getExtension("delay", "urn:xmpp:delay");
        if (timestamp == null)
            timestamp = (DelayInformation)msg.getExtension("x", "jabber:x:delay");
        if (timestamp != null)
            date = timestamp.getStamp().getTime();
    }
}

最新更新