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

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来测试消息的发送与接收,因为它不识别你新封装和扩展的东西,要么自己用两个手机安装客户端自己发送消息测试,要么开两个模拟器进行测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Smack是一个开源的XMPP客户端库,可用于在Android平台上构建即时通信应用程序。在使用SmackAndroid应用程序中,需要使用Smack-Android库来处理网络和连接管理。 以下是一个简单的示例代码,演示如何使用Smack-Android库连接到XMPP服务器并发送消息: 1. 添加依赖库 在项目的build.gradle文件中添加以下依赖: ``` dependencies { implementation 'org.igniterealtime.smack:smack-android-extensions:4.4.0' implementation 'org.igniterealtime.smack:smack-tcp:4.4.0' } ``` 2. 初始化连接 在应用程序启动时,需要初始化XMPPConnection对象,并且连接到XMPP服务器。 ``` XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder() .setUsernameAndPassword("username", "password") .setXmppDomain("example.com") .setHost("xmpp.example.com") .setPort(5222) .setSecurityMode(ConnectionConfiguration.SecurityMode.required) .build(); XMPPTCPConnection connection = new XMPPTCPConnection(config); try { connection.connect(); connection.login(); // Connection successful } catch (SmackException | IOException | XMPPException e) { e.printStackTrace(); // Connection failed } ``` 3. 发送消息 连接成功后,可以使用XMPPConnection对象发送消息。 ``` ChatManager chatManager = ChatManager.getInstanceFor(connection); Chat chat = chatManager.createChat("recipient@example.com"); try { chat.sendMessage("Hello, World!"); } catch (SmackException.NotConnectedException | InterruptedException e) { e.printStackTrace(); } ``` 这是一个简单的Smack-Android示例,用于连接到XMPP服务器并发送消息。当然,在实际应用程序中可能需要更多的功能和处理,但这个示例提供了一个入门的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值