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

标签 android xmpp smack

我知道 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();

    }
}

关于android - 如何实现延迟交付 (XEP-203) Smack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49138262/

相关文章:

Android Studio 2.2 预览版 Record Espresso Test 选项不可用

javascript - Openfire 在一天后删除 pubsub 节点(不是在服务器重启或删除缓存后)

android - (a) 击打 : TLS socket is closed when trying to login with XMPP

xmpp - 启用流管理 xmpp 连接 smack 4.1

android - 将 MediaPlayer 服务绑定(bind)到 Activity 时出错

android - android gridview 中带有文本的图像

xmpp - XMPP 多用户 session 室收到重复消息

Android Smack MUC 400 Bad Request 发送群组聊天消息

android - 无法使用 XMPP 和 aSmack 在 Android 中接收聊天消息

android - 为什么要使用 VBO 和/或 IBO 而不是简单的顶点数据?