【问题标题】:When is ProcessPacket is getting called in addSyncStanzaListener (smack 4.1.4)何时在 addSyncStanzaListener 中调用 ProcessPacket (smack 4.1.4)
【发布时间】:2026-01-09 12:40:01
【问题描述】:

我正在尝试在我正在使用 smack 4.1.4 库开发的 android 聊天应用程序中接收聊天消息,我可以发送消息但我无法接收任何消息。 ProcessPacket 下面的方法没有被调用。这是我的代码:

protected Void doInBackground(String... urls) {
        StanzaFilter filter = new StanzaTypeFilter(org.jivesoftware.smack.packet.Message.class);
        connection.addSyncStanzaListener(new StanzaListener() {
            public void processPacket(Stanza stanza) {
                Message message = (Message) stanza;
                if (message.getBody() != null) {
                    String fromName = message.getFrom();
                    chatMessage newMsg = new chatMessage(message.getBody(), "in");
                    chatList.add(newMsg);
                    Log.i("XMPPClient", "Got text [" + message.getBody() + "] from [" + fromName + "]");
                    myadapter = new chatAdapter(actualChatActivity.this, R.layout.single_message, chatList);
                    chatListView.setAdapter(myadapter);
                }
            }
        }, filter);
        return null;
    }
public Void setConnection(XMPPConnection connection)
{
    this.connection=connection;
    if (connection != null) {
        // Add a packet listener to get messages sent to us

        new ReceiveMessageTask().execute();
    }
    return null;
}

我该如何解决我的问题?

【问题讨论】:

    标签: android xmpp smack


    【解决方案1】:

    尝试使用addPacketListener 而不是addSyncStanzaListener

    PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
                        connection.addPacketListener(new PacketListener() {
                public void processPacket(Packet packet) {
                    Message message = (Message) packet;
                    if (message.getBody() != null) {
                        messageReceived(
                                StringUtils.parseBareAddress(message.getFrom()), 
                                message.getBody()
                                );
                    }
                }
            }, filter); 
    

    【讨论】:

    • 你能告诉我如何使用这个库 4.1.4 发送和接收 msg。
    【解决方案2】:

    使用以下过滤器:

    FromMatchesFilter filter = FromMatchesFilter.createBare("id@jabber.org");
    m_packet_collector = m_connection.createPacketCollector(filter);
    

    Bare vs Full 过滤器:Bare 格式,仅匹配“id@jabber.org”,而完整过滤器匹配“id@jabber.org/resoure”。

    【讨论】: