微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用Android中的Smack客户端在聊天窗口外部的单个位置收听多个MUC聊天组消息

如何解决如何使用Android中的Smack客户端在聊天窗口外部的单个位置收听多个MUC聊天组消息

然后,当我打开特定群组的聊天窗口时,我将通过以下代码创建/加入群组

 private MultiUserChat joinRoom(String roomName) throws XmppStringprepException,XMPPException.XMPPErrorException,MultiUserChatException.NotAMucServiceException,SmackException.NotConnectedException,InterruptedException,SmackException.noresponseException,MultiUserChatException.MucAlreadyJoinedException {
        if (roomName.equals("")) {
            logAndToast("Enter room name");
            return null;
        }

        if (MyXMPP.connection != null && MyXMPP.connection.isAuthenticated()) {
            // Get the MultiUserChatManager
            MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(MyXMPP.connection);

            // Create the XMPP address (JID) of the MUC.
            EntityBareJid mucJid = (EntityBareJid) JidCreate.bareFrom(XMPPHelper.getRoomName(roomName));

            // Create a MultiUserChat using an XMPPConnection for a room
            MultiUserChat muc2 = manager.getMultiUserChat(mucJid);

            // User2 joins the new room
            // The room service will decide the amount of history to send
            // Create the nickname.
            Resourcepart nickname = Resourcepart.from(PreferenceManager.getStringPreference(this,PreferenceManager.XMPP_USER_NAME));

            MucEnterConfiguration.Builder mec = muc2.getEnterConfigurationBuilder(nickname);
           
            MucEnterConfiguration mucEnterConfig = mec.build();
            muc2.join(mucEnterConfig);
            return muc2;
        }
        return null;
}//end of MultiUserChat()

此后,我为该组设置传入的消息侦听器,如下所示:

multiUserChat = joinRoom("myRoomName"));
if (multiUserChat != null) {
    multiUserChat.addMessageListener(new MessageListener() {
        @Override
        public void processMessage(final Message message) {
            //here I received messages for the perticular group that I joined
        }
    });

    if (multiUserChat.isJoined()) {
        logAndToast("join xmpp room successfully");
    } else {
        logAndToast("join xmpp room not joined");
    }
}

当我在特定的小组窗口中时,通过以上代码收到了所有消息。

我需要一种解决方案,当我在组窗口之外时如何接收所有组中的所有传入消息。

我在下面提到了MUC群聊的链接 https://download.igniterealtime.org/smack/docs/latest/documentation/extensions/muc.html

搜索/访问了许多链接,但找不到任何对我有用的解决方案。请帮助我提供解决方案。

预先感谢。

解决方法

要在不加入或退出聊天窗口的情况下接收任何群组消息,您需要订阅该群组。

我们可以使用MucSub:多用户聊天订阅来实现相同的功能 https://docs.ejabberd.im/developer/xmpp-clients-bots/extensions/muc-sub/

我们可以使用以下代码订阅群组以获取自定义消息

fun subscribeMUCRoom(context: Context?,toGroupName: String) { 
        if (!isStrNotNull(toGroupName) || MyXMPP.Companion.connection == null) {
            return
        }
        try {
            val iq: IQ = object : IQ("subscribe","urn:xmpp:mucsub:0") {
                override fun getIQChildElementBuilder(xml: IQChildElementXmlStringBuilder): IQChildElementXmlStringBuilder {
                    xml.append(" nick=")
                    xml.append("'" + Your Display Name + "'")
                    xml.rightAngleBracket()
                    xml.append("""<event node='urn:xmpp:mucsub:nodes:messages' />
    <event node='urn:xmpp:mucsub:nodes:affiliations' />
    <event node='urn:xmpp:mucsub:nodes:subject' />
    <event node='urn:xmpp:mucsub:nodes:config' />""")
                    return xml
                }
            }
            iq.type = IQ.Type.set
            iq.setTo(toGroupName+ "@conference.yourdomain.com)
            iq.setFrom(userJid)
            setIQ(iq)
            connection?.sendStanza(iq)
            Log.d(TAG,"subscribeMUCRoom :: " + iq.toString() + " :: " + iq.childElementXML)
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

您可以通过此代码收听自定义消息的成功失败

@Throws(NotConnectedException::class,InterruptedException::class)
    fun setIQ(iq: IQ?) {
        MyXMPP.connection!!.sendIqWithResponseCallback(iq,PacketListener { packet -> d(TAG,"setIQ :: success : $packet" /*.toXML()*/) },ExceptionCallback { exception ->
            exception.printStackTrace()
            d(TAG,"setIQ :: processException : " + exception.message)
        },10000)
    }

成功订阅该群组后,您可以使用以下代码收听该订阅群组的传入消息

private fun groupMessageListener() {
        connection!!.addAsyncStanzaListener(StanzaListener { packet ->
            val message = packet as Message
            
        },AndFilter(StanzaTypeFilter.MESSAGE,MessageTypeFilter.GROUPCHAT))
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?