Android:接收消息时出现 XMPP 消息格式问题

Posted

技术标签:

【中文标题】Android:接收消息时出现 XMPP 消息格式问题【英文标题】:Android : XMPP message format issue while receive message 【发布时间】:2017-04-17 09:48:19 【问题描述】:

我在 android 中通过 XMPP 接收消息时遇到问题。

发送消息格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<message xmlns="jabber:client" to="33@xx.xx.xx" from="1014@xx.xx.xx" 
type="chat" mediaType="text">
<body>Hello</body>
<mediaType>text</mediaType>
<mediaUrl />
<thumbUrl />
<from_id>1014</from_id>
<user_profile_pic>http://www..</user_profile_pic>
<user_profile_name>XYZ</user_profile_name>
<uniqueID>xsFf2ifTszKVg11ogAlgziD1IwWjcJ</uniqueID>
</message>

但我在 Android XMPP 中得到以下格式:

<?xml version="1.0" encoding="UTF-8"?>
<message to="33@xx.xx.xx" from="1014@35.166.209.154/a94o853phq" type="chat">
<body>Hello</body>
<thread>61242b7c-e843-45cf-a9ff-0383ebf60aeb</thread>
<mediaType xmlns="jabber:client" />
<mediaUrl xmlns="jabber:client" />
<thumbUrl xmlns="jabber:client" />
<user_profile_pic xmlns="jabber:client" />
<user_profile_name xmlns="jabber:client" />
<uniqueID xmlns="jabber:client" />
<from_id xmlns="jabber:client" />
</message>

发送消息代码:

DefaultExtensionElement extXMPPMessage = new DefaultExtensionElement("message", "jabber:client");
   extXMPPMessage.setValue("to", toUser);
   extXMPPMessage.setValue("from", fromUser);
   extXMPPMessage.setValue("body", message);
   extXMPPMessage.setValue("type", type);
   extXMPPMessage.setValue("mediaType", mediaType);
   extXMPPMessage.setValue("mediaUrl", mediaURL);
   extXMPPMessage.setValue("thumbUrl", thumbURL);
   extXMPPMessage.setValue("from_id", from_id);
   extXMPPMessage.setValue("user_profile_pic", user_profile_pic);
   extXMPPMessage.setValue("user_profile_name", user_profile_name);
   extXMPPMessage.setValue("uniqueID", uniqueID);

   Message msg = new Message();
   msg.setType(Message.Type.chat);
   msg.setTo(toUser);
   msg.setFrom(fromUser);
   msg.setBody(message);
   msg.addExtension(extXMPPMessage);
   chat.sendMessage(msg); //chat is Object of Chat class

我可以在接口方法中接收消息:

@Override
public void processMessage(Chat chat, Message message) 
   Log.e(TAG, "ProcessMessage Message received " + message.toString());

我不知道是什么问题,我得到了完美的身体,我也成功收到了一条消息,但媒体类型、用户名、用户个人资料每个标签都变空了,请帮助我。谢谢。

【问题讨论】:

您使用的是哪个版本的 smack? 嗨@SANAT,Smack 版本 4.1.4 将消息从 android 传递到 android 时会发生什么? 在 Android 到 Android 也面临同样的问题 请发布您的代码以发送消息和接收消息 【参考方案1】:

您正在像这样在命名空间中传递jabber:client

new DefaultExtensionElement("message", "jabber:client");

所以,当您收到它时,您会在xmlns 中获得jabber:client

如果您想通过DefaultExtensionElement 传递数据,请使用如下方式:

DefaultExtensionElement extEenderName = new DefaultExtensionElement(
                    "msgSenderName", "");
            extEenderName.setValue("msgSenderName", "Sanat");
            msg.addExtension(extEenderName);

不要在那里传递namespace。我将单个 DefaultExtensionElement 用于单个值。它的工作。

不要传递到 DefaultExtensionElement 中的正文。只需传递到 Message 对象中的正文即可。然后为其他东西添加单独的扩展。

对其他类型数据的一个建议是将 JsonObject 作为字符串传递给正文,其中包含您的文本内容和其他数据,如 mediaType、mediaUrl 等。

【讨论】:

好的,谢谢您的回答,这是为了发送,但为什么我从 iPhone 和 Web 得到相同的响应。? iPhone 到网站和网站到 iPhone 聊天工作正常。 那你需要把Message对象匹配到web/ios。您实际上只是在消息标记中获取命名空间值。 我已经建议你在 Body 标记中将 JsonObject 作为字符串传递。它将在所有平台上轻松可用并轻松解析正文数据。 消息接收方代码有问题吗?因为我正在使用 ChatMessageListener 嗯,我知道在正文中传递 JSON 是件好事。但是现在我无法根据网络更改我的结构,并且 iPhone 团队需要更改结构。 :(

以上是关于Android:接收消息时出现 XMPP 消息格式问题的主要内容,如果未能解决你的问题,请参考以下文章

Android中实现自定义XMPP消息包收发

Android中实现自定义XMPP消息包收发

MultiUserChat 发送和接收消息错误

我可以通过 Firebase Admin SDK 接收来自设备的上游消息,而无需在应用程序服务器上实现 XMPP

SmackInitialization:无法确定 Smack 版本

Android中的Xmpp消息接收问题