首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smack 4.1禁用自动收据

Smack 4.1禁用自动收据
EN

Stack Overflow用户
提问于 2015-05-08 13:04:53
回答 3查看 753关注 0票数 0

我刚刚从折旧的asmack切换到Smack 4.1。Smack 4.1自动发送带有错误id的收据,这在我的情况下导致异常。

Smack 4.1用收据附加两个不同的id

以下是聊天消息收到的消息

代码语言:javascript
复制
RECV (0): <message from='***' to='***' xml:lang='en' id='65' kind='0' type='chat'><body>vhh</body><request xmlns='urn:xmpp:receipts'/></message>

以下是Smack4.1响应聊天消息生成的接收收据

代码语言:javascript
复制
SENT (0): <message to='***' id='roZ7C-32' type='chat'><received xmlns='urn:xmpp:receipts' id='65'/></message>

Smack 4.1使用接收到的 id='roZ7C-32'id='65'附加两个不同的id。

我的问题是:

  1. 如何使这两个ids相同?
  2. 如何禁用收据,以便生成自定义菜谱
EN

回答 3

Stack Overflow用户

发布于 2016-01-27 07:59:39

对于第一个问题,要获取发送消息的ID,代码如下:

代码语言:javascript
复制
Message ms = new Message();
ms.addBody("EN", Messegeforsend);
DeliveryReceiptRequest.addTo(ms); //tells that you will need delivery for this message
String send_message_id= ms.getStanzaId();

您可以获得传递消息的ID,这与发送的消息的ID相同:

代码语言:javascript
复制
deliveryReceiptManager = DeliveryReceiptManager.getInstanceFor(connection);
deliveryReceiptManager.addReceiptReceivedListener(new ReceiptReceivedListener() {

            @Override
            public void onReceiptReceived(String arg0, String arg1, String arg2,Stanza arg3) {
                String delivered_message_id = arg2;
}

});

send_message_id将与delivered_message_id完全相等,因此您将知道已经传递了哪条消息

票数 0
EN

Stack Overflow用户

发布于 2016-02-03 03:52:23

SMACK 4.1.0消息接收监听器以编写以下代码

代码语言:javascript
复制
try {
                Message ms = new Message();
                ms.addBody("EN", "deleriyed");
                ms.setTo(message.getFrom());
                ms.setStanzaId(message.getStanzaId());
                DeliveryReceiptRequest.addTo(ms);
                connection.sendStanza(ms);
            } catch (NotConnectedException e) {
                e.printStackTrace();
            }
票数 0
EN

Stack Overflow用户

发布于 2019-06-21 14:12:28

禁用此功能的方法就是在发送邮件时不向消息添加收据:

最重要的方法是

processPacketExtension

代码语言:javascript
复制
//Creating message in your method
public sendMessage(Jid to, String body){
    Message msg = Message(to, body);
    //Create and save your deliveryID to SQLite database
    deliveryID = DeliveryReceiptRequest.addTo(msg);
    ChatManager.getInstanceFor(connection).chatWith(jid).send(msg);
}

//Declare your stanza listener
private MessagePacketListener messagePacketListener;
//In your cotnructor   
messagePacketListener = new MessagePacketListener(context);

//Then in your login method register your stanza listener like this
public void login() throws SmackInvocationException, XmppStringprepException {
        connect();
        try {
            if (!con.isAuthenticated()) {
                ....
                con.addSyncStanzaListener(messagePacketListener, new StanzaTypeFilter(Message.class));
                ....
                }
        } catch(Exception e) {
                    ....
            }
        }



//Your StanzaListener where you parse your incoming message and if it is without body it is Delivery receipt
//Now you have your MessagePacketListener that process the incoming messages

public class MessagePacketListener implements StanzaListener{
    private Context context;

    MessagePacketListener(Context context) {
        this.context = context;
    }    
    @Override
    public void processStanza(Stanza packet) {
        Message msg = (Message)packet;

        //Message that have body
        if(msg.getBodies().size() > 0){
            //Text message
            //Do something with message msg.getBody()
        }
        else{
            //This must be sth like delivery receipt or Chat state msg and get your deliveryID
            processPacketExtension(msg);
        }
    }

    //processPacketExtension method that receive packet delivery ectension
    private void processPacketExtension(Message msg) {
        Collection<ExtensionElement> extensions = msg.getExtensions();
        if (extensions != null) {
            Iterator<ExtensionElement> iterator = extensions.iterator();
            if (iterator.hasNext()) {
                ExtensionElement extension = iterator.next();                
                if(extension instanceof DeliveryReceipt){
                    //Do sth with deliveryID
                    String deliveryID = ((DeliveryReceipt) extension).getId();
                }
            }
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30124626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档