您的位置:首页 > 移动开发 > Android开发

Android 修改Message的body格式,用以存放消息时间等-smack:4.3.4

2019-10-12 09:16 204 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/u014714188/article/details/102514155

Android 修改Message的body格式,用以存放消息时间等-smack:4.3.4

我们上一篇文章讲了如何直接去扩展Message的节点,但我们会发现最后功能的实现有些复杂,当我们在客户端发送消息时添加扩展后,不知为啥,接收的时候总是无法解析。现在我们用另外一种更为简便的方法来获取消息内容的同时获取消息的时间。

首先,我们同样来看看Message原始的xml结构

初始的时候,我们在body里面只是存放了String类型的消息内容,那么我们是否可以不只是存放消息的内容呢,我们可以把我们需要的信息都放到body里面,到时候直接解析就行。针对这一个想法,我们继续往下实现。

<message to='17761207347@xie-pc' id='1rVcJ-83'>
<body>消息内容</body>
</message>

要实现的目标格式

我们从下面的格式中可以看到,body里面放入了消息的内容,消息时间,消息来源,消息类型,当然你还可以放入别的东西,如发送用户的昵称,头像等等。

<message to="17761207347@xie-pc" id="1rVcJ-83" from="17761207344@xie-pc/Android">
<body>{"data":"999999999999999","sendtime":"2019-10-12 09:08:51","source":"Android","type":"chat"}</body>
</message>

接下来就正式的开始实现。

我们看到,body里面包含了data,sendtime,source,type四个字段,我们就自定义一个MyMessage类来包含这个几个字段。下面的代码很简单易懂吧。

package cn.xie.imchat.utils;

import java.io.Serializable;

/**
* @author xiejinbo
* @date 2019/10/11 0011 17:11
*/
public class MyMessage implements Serializable {
private static final long serialVersionUID = -2790672475566638165L;
public Object data;
public String type;
public String sendtime;
public String source;

}

这里就来看看我们发送消息的时候该如何去封装

下面是我截取的代码段,我们可以看到MyMessage 在各个字段赋值后,通过Message 的setBody方法被封装到了body里面,然后直接调用发送即可。至于文中的JSON包,配置引用:
implementation ‘com.alibaba:fastjson:1.1.52.android’

//自定义消息
MyMessage myMessage = new MyMessage();
myMessage.data = inputMsg;  //消息内容
myMessage.type = type;      //消息类型(chat/groupchat)
myMessage.sendtime = Util.getNewDate();  //消息时间
myMessage.source = "Android";			//消息来源

//封装body
Message message = new Message();
message.setBody(JSON.toJSONString(myMessage));
chat.send(message);

在调用消息发送方法后,我们可以看到如下的消息

这就是最后封装好后发出去的格式

<message to='17761207347@xie-pc' id='1rVcJ-83'>
<body>{&quot;data&quot;:&quot;999999999999999&quot;,&quot;sendtime&quot;:&quot;2019-10-12 09:08:51&quot;,&quot;source&quot;:&quot;Android&quot;,&quot;type&quot;:&quot;chat&quot;}</body>
</message>

上面是消息的发送,接下来就是消息的接收了

各位原来的接收规则不必变化,只是原来在getbody的时候获取的是纯的消息内容,现在获取的是包含消息内容,消息时间,消息类型,消息来源的body。下面的就是我们在监控到新消息来临时获取到的Message格式。

<message to="17761207347@xie-pc" id="1rVcJ-83" from="17761207344@xie-pc/Android">
<body>{"data":"999999999999999","sendtime":"2019-10-12 09:08:51","source":"Android","type":"chat"}</body>
</message>

然后通过下面的代码能把消息body直接转换成MyMessage 的一个对象。

MyMessage myMessage = JSON.parseObject(message.getBody(), MyMessage.class);

我们通过添加下面的打印可以看到对象里面的具体内容了。

Log.e("xjbo","myMessage: "+JSON.toJSON(myMessage));

这就是对象里面的具体内容,我们就能直接拿到数据了:myMessage.data.toString()消息的内容,myMessage.sendtime消息的发送时间

E/xjbo: myMessage: {"data":"999999999999999","sendtime":"2019-10-12 09:08:51","source":"Android","type":"chat"}

最后,我们来看看最后的消息截图


ps:
最后也是需要记住的一点:在利用openfire进行开发的时候,如果已经是开始自己封装消息之类的,不要再用spark来测试消息的发送与接收,因为它不识别你新封装和扩展的东西,要么自己用两个手机安装客户端自己发送消息测试,要么开两个模拟器进行测试。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: