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

时间:2016-11-21 12:02:15

标签: android xmpp smack groupchat

我正在使用smack库开发聊天应用程序。我在群聊中有问题。在我的应用程序中,我正在创建一个组,并且成员是自动加入的。我想在组中发送消息时通知所有用户,即使他们没有发起聊天。我的代码如下所示我有将侦听器放在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可以&#39 ;但是当用户2在该组内发送消息时,他们都能够接收消息。

请帮助我,我无法找到解决方案。请不要提供已经弃用的建议。

先谢谢。!!

2 个答案:

答案 0 :(得分:1)

我在完整的代码审核后完整编辑了答案。 - 同样 -

我建议重构你的代码,以便在超过1个庞大的类中保持角色分离。

基本上,由于许多" addasync - addsync"而您正在考虑错误监听器中的消息。在您的代码中,您可以接收消息,就像您的怪物级全押的副作用一样!

我看到您需要对代码进行许多优化。 然而,解释并且不可能的时间太长了,例如:

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);  必须添加一个侦听器ONCE,否则您将创建大量的线程。可能它有效,因为你有一个单身人士。虽然你有一个听众,但如果你不删除它,你就不需要再添加它了。

  1. mConnection.addSyncStanzaListener(this, null); 小心:你正在添加你的监听器(哪一个?你用相同的类实现了大量的监听器)到你的连接。在你的代码之前或之后会吃一个重要的节(增加一个自定义IQ),你会发现很难发现副作用。
  2. mConnection.addAsyncStanzaListener(this, null);同样的3
  3. 在之前或之后检查ProviderManager.addExtensionProvider() 你需要一些。
  4. 希望有所帮助。

答案 1 :(得分:1)

试一下

step1: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);
    }

    }