问题描述
然后,当我打开特定群组的聊天窗口时,我将通过以下代码创建/加入群组
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))
}