无法使用 smack-android:4.1.4 接收群聊消息

Can't able to receive group chat messages using smack-android:4.1.4

我正在使用 smack 库开发聊天应用程序。我在群聊中遇到问题。在我的应用程序中,我正在创建一个组,其中的成员是自动的-joined.i 想要在我在组中发送消息时通知所有用户,即使他们没有启动 chat.My 代码如下因为我在 init 方法中放置了侦听器但无法接收消息。

        multiUserChatManager = MultiUserChatManager.getInstanceFor(mConnection);
        mMultiUserChat = multiUserChatManager.getMultiUserChat(to);
        mConnection.addAsyncStanzaListener(this, null);
        DiscussionHistory history = new DiscussionHistory();
        history.setMaxStanzas(0);
        mMultiUserChat.addMessageListener(this);
        mConnection.addSyncStanzaListener(this, null);
        try {
            mMultiUserChat.join(from, "", history, SmackConfiguration.getDefaultPacketReplyTimeout());
        } catch (SmackException.NoResponseException e) {
            e.printStackTrace();
        } catch (XMPPException.XMPPErrorException e) {
            e.printStackTrace();
        } catch (SmackException.NotConnectedException e) {
            e.printStackTrace();
        }

这里是群

的消息监听器
 @Override
public void processMessage(Message message) { 
    Logg.e(TAG,"Message received group.."); 
}

我不知道为什么有人在群里发消息时不调用这个方法,即使我加入了群,如果我创建1个群并加入2个用户,当1个用户在群中发消息时user2不能能够接收消息,但是当用户2在该组内发送消息时,他们都能够接收消息。

请帮帮我,我找不到解决办法。请不要给出已经弃用的建议。

提前致谢!

完整的代码审查后,我正在编辑完整的答案。 -再次-

我建议重构您的代码,以在超过 1 个巨大 class 中保持角色分离。

基本上,由于您的代码中有许多 "addasync - addsync",您在错误的侦听器中接收消息,并且您能够接收消息,就像您的怪物-class-all-in 的副作用一样!

我看到您需要对代码应用许多优化。 太长了,没法解释,不过举个例子:

1. sendGroupMessage You can check by MultiUserChatManager if you
already joined the chat and then send the message. You must fire a
"join" just once, not everytime you want to send a message.

2。 mMultiUserChat.addMessageListener(this); 必须添加一次侦听器,否则您将创建大量线程。可能它有效,因为你有一个单身人士。当你有一个监听器时,如果你不删除它,你就不需要再将它添加到该聊天中。

  1. mConnection.addSyncStanzaListener(this, null); 小心:您正在将您的侦听器(哪一个?您实现了大量具有相同 class 的侦听器)到您的连接中。之前或之后你的代码将吃掉一个重要的节(很可能是一个自定义 IQ)并且你将很难发现副作用。
  2. mConnection.addAsyncStanzaListener(this, null); 同 3
  3. ProviderManager.addExtensionProvider() 之前或之后检查 你需要一些。

希望对您有所帮助。

试试这个

步骤 1 : 1 删除这个

mConnection.addAsyncStanzaListener(this, null);
mConnection.addSyncStanzaListener(this, null);

第 2 步:添加这个

 private StanzaTypeFilter serverFilter;
    private StanzaListener stanzaListener = null;
    private XMPPTCPConnection mConnection;



 registerStanzaListener(); // where you init connection

public void registerStanzaListener() {
        serverFilter = new StanzaTypeFilter(Message.class);

        if (stanzaListener != null) {
            mConnection.removeAsyncStanzaListener(stanzaListener);
        }

        stanzaListener = new StanzaListener() {
            @Override
            public void processPacket(Stanza packet) throws SmackException.NotConnectedException {
                processMessage((Message) packet);
            }
        };

        mConnection.addAsyncStanzaListener(stanzaListener, serverFilter);
    }

    }