我正在开发基于Android的XMPP的聊天应用程序。
我已经完成了一对一聊天功能,但在多用户聊天中遇到了一些问题。
我已经成功创建了新的聊天室,多个用户可以加入该会议室。
我还编写了addPacketListener
代码,用于与PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
当用户在组中发送消息时,我也会在该侦听器中接收消息, 但我无法区分哪个用户发送了消息。
就像一对一聊天消息包有函数message.getFrom()
来检索发件人JID。
如果是多用户聊天,同样的功能会将群组/房间JID作为发件人返回。
我还尝试在发送message.setFrom(senderJID);
或message.setFrom(sendername@conference.hostname/Groupname);
仍然无法获得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 );
}
}
});
感谢您的任何帮助或建议
答案 0 :(得分:2)
这段代码将识别聊天室:
String fromName = StringUtils.parseBareAddress(message
.getFrom());
您可以使用此代码来识别聊天室用户的昵称:
String nick = StringUtils.parseResource(message
.getFrom());
这是因为多用户聊天消息的JID看起来像roomname@server/nickname
,用户的昵称是JID的资源。
答案 1 :(得分:0)
如何获取发件人用户JID或其昵称?来自消息(数据包) 消息监听
如果你看一下XEP-45 7.4,你会发现来自JID的是JUC的裸JID加上MUC的成员昵称作为资源。所以昵称是来自JID的资源。
如果房间是非匿名的,您可以在扩展状态信息中获取占用者的完整JID(XEP-45 7.2.4)