Xmpp 如何使用Smack在多用户聊天消息中检索发件人名称或其JID?

Xmpp 如何使用Smack在多用户聊天消息中检索发件人名称或其JID?,xmpp,smack,multiuserchat,Xmpp,Smack,Multiuserchat,我正在Android上开发基于XMPP的聊天应用程序 我已经完成了一对一聊天功能,但在多用户聊天中遇到了一些问题。 我已经成功创建了新的聊天室,多个用户可以加入该聊天室。 我还为使用PacketFilter=newmessagetypefilter(Message.Type.groupchat)的群组聊天编写了addPacketListener代码 当用户在组中发送消息时,我也在该侦听器中接收消息, 但我无法区分哪个用户发送了消息。 像一对一聊天信息包一样,它具有函数message.getFro

我正在Android上开发基于XMPP的聊天应用程序

我已经完成了一对一聊天功能,但在多用户聊天中遇到了一些问题。 我已经成功创建了新的聊天室,多个用户可以加入该聊天室。 我还为使用
PacketFilter=newmessagetypefilter(Message.Type.groupchat)的群组聊天编写了
addPacketListener
代码

当用户在组中发送消息时,我也在该侦听器中接收消息, 但我无法区分哪个用户发送了消息。

像一对一聊天信息包一样,它具有函数
message.getFrom()
来检索发送者JID

在多用户聊天的情况下,相同的函数返回作为发件人的组/房间JID。

我还尝试在发送
Message.setFrom(senderJID)时设置Message的属性
message.setFrom(sendername@conference.hostname/组名)

我仍然无法得到senderJID或它的昵称

所以我的问题是: 如何获取发件人用户JID或其昵称?来自messageListener中的消息(数据包)

在组中发送消息的代码为:-

String to = strGroupJID;
String text = etChatOnTextBox.getText().toString();
if(!text.equals(""))
{
        Message msg = new Message(to, Message.Type.groupchat);
        msg.setBody(text);
        String name1 = xmppConnection.getUser();
        name1 = name1.substring(0, name1.lastIndexOf("@"));
        name1 = name1 + "@conference.192.168.56.1";
       // name1 = name1 + "@conference.192.168.56.1/" + strGroupName ;
        msg.setFrom(name1);
        muc.sendMessage(msg);
 }
接收信息的代码为:-

PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
        connection.addPacketListener(new PacketListener() {
            @Override
            public void processPacket(Packet packet) {
                Message message = (Message) packet;
                if (message.getBody() != null) {
                    String fromName = StringUtils.parseBareAddress(message
                            .getFrom());

                    Log.i("ChatOn", "Text Recieved " + message.getBody()
                            + " from " + fromName );
           }
        }
   });
任何帮助或建议都将不胜感激,谢谢

如何获取发件人用户JID或其昵称?从中的消息(数据包) messageListener

如果您查看XEP-457.4,您将看到from JID是MUC的裸JID加上MUC作为资源的成员昵称。所以这个昵称是来自JID的资源


如果聊天室是非匿名的,您可以在扩展状态信息()中获得该用户的完整JID()

这段代码将识别聊天室:

String fromName=StringUtils.parseBareAddress(消息
.getFrom());
您可以使用此代码识别聊天室用户的身份:

String nick=StringUtils.parseResource(消息
.getFrom());

这是因为多用户聊天消息的jid看起来像
roomname@server/昵称
,用户的昵称是JID的来源。

当我在我的侦听器代码中收到消息时,它只是将房间的JID作为发送者返回。因此,我无法区分谁是组中的邮件发件人。请启用Smack debug并显示使用完整的节you a receiving。您好,我已打印了该变量的值,并将其返回给我welcome@conference.192.168.56.1welcome是我的组/房间的名称,它不返回给我发送msgWhich变量的用户的昵称
fromName
nick
?很抱歉,这是fromName变量。我在nick变量中得到nick名称。谢谢你,我能再问一个问题吗?我没有这个问题,但与多用户聊天有关?最好把它作为一个单独的问题发布,这样更多的人可以看看它。