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

Android Smack 扩展Message消息节点(smack:4.3.4)-扩展消息时间和用户信息

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

Android Smack 扩展Message消息节点(smack:4.3.4)

我们都知道在利用openfire+smack开发即时聊天工具时,由于自带Message消息体的局限性,消息题里面很简单,有些不符合自己的需求。这就需要我们自己去扩展message的消息节点,本文在最新的smack:4.3.4基础上给大家展示扩展Message消息节点date来放置消息时间。

首先,我们来看看Message原始的节点

下面的就是初始的Message节点,我们看到除了自身包含的from、to、type等属性外,只是包含了body子节点,用于放置消息内容,很简单。

<message from='发送方jid' to='接收方jid' type='消息类型(普通消息/群聊)'>
<body>消息内容</body>
</message>

我们再来看看要扩展的效果

下面是我们要扩展的最终效果,添加了消息时间的节点,用于放置消息的时间

<message id='76Ws9-11' from='发送方jid' to='接收方jid' type='消息类型(普通消息/群聊)'>
<body>消息内容</body>
<date>2019-10-11 10:05</date>
<userinfo xmlns="com.xml.extension">
<nickname>菜鸟</nickname>
<icon>http://www.liaoku.org/</url>
</userinfo>
</message>

接下来就是正式进入正题,先自定义实现扩展消息时间节点

我相信懂一点儿Java的都能看明白下面扩展消息时间节点AddMessageDate的实现,相关地方都有了注释

package cn.xie.imchat.utils;

import org.jivesoftware.smack.packet.ExtensionElement;

/**
* message扩展类
* 扩展前:<message from='发送方jid' to='接收方jid' type='消息类型(普通消息/群聊)'>
*          <body>消息内容</body>
*        </message>
* 扩展后:<message id='76Ws9-11' from='发送方jid' to='接收方jid' type='消息类型(普通消息/群聊)'>
*          <body>hello 你好</body>
*          <date>2019-10-11 10:05</date>
*        </message>
* @author xiejinbo
* @date 2019/10/11 0011 10:39
*/
public class AddMessageDate implements ExtensionElement {

//消息时间元素名称
public static final String Element_DATE = "date";
//消息时间值(对外开放)
private String dateText;

public String getDateText() {
return dateText;
}

public void setDateText(String dateText) {
this.dateText = dateText;
}

@Override
public String getNamespace() {
return null;
}

@Override
public String getElementName() {
return Element_DATE;
}

@Override
public CharSequence toXML(String enclosingNamespace) {
StringBuilder sb = new StringBuilder();
sb.append("<").append(Element_DATE).append(">");
sb.append(dateText);
sb.append("</"+Element_DATE+">");
return sb.toString();
}
}

接下来就是扩展用户信息的节点,AddMessageInfo

AddMessageInfo 是自定义扩展用户信息的,带来用户昵称和用户头像

package cn.xie.imchat.utils;

import org.jivesoftware.smack.packet.ExtensionElement;

/**
* message扩展类
* 扩展前:<message from='发送方jid' to='接收方jid' type='消息类型(普通消息/群聊)'>
*          <body>消息内容</body>
*        </message>
* 扩展后:<message id='76Ws9-11' from='发送方jid' to='接收方jid' type='消息类型(普通消息/群聊)'>
*          <body>hello 你好</body>
*          <userinfo xmlns="com.xml.extension">
*              <nickname>菜鸟</nickname>
*              <icon>http://www.liaoku.org/</url>
*          </userinfo>
*        </message>
* @author xiejinbo
* @date 2019/10/11 0011 10:01
*/
public class AddMessageInfo implements ExtensionElement {
public static final String NAME_SPACE = "com.xml.extension";
//用户信息元素名称
public static final String ELEMENT_NAME = "userinfo";

//用户昵称元素名称
private String nickNameElement = "nickname";
//用户昵称值(对外开放)
private String nickNameText = "";

//用户头像元素名称
private String iconElement = "icon";
//用户头像值(对外开放)
private String iconText = "";

public String getNickNameText() {
return nickNameText;
}

public void setNickNameText(String nickNameText) {
this.nickNameText = nickNameText;
}

public String getIconText() {
return iconText;
}

public void setIconText(String iconText) {
this.iconText = iconText;
}

@Override
public String getNamespace() {
return NAME_SPACE;
}

@Override
public String getElementName() {
return ELEMENT_NAME;
}

@Override
public CharSequence toXML(String enclosingNamespace) {
StringBuilder sb = new StringBuilder();
sb.append("<").append(ELEMENT_NAME).append(" xmlns=\"").append(NAME_SPACE).append("\">");
sb.append("<" + nickNameElement + ">").append(nickNameText).append("</"+nickNameElement+">");
sb.append("<" + iconElement + ">").append(iconText).append("</"+iconElement+">");
sb.append("</"+ELEMENT_NAME+">");
return sb.toString();
}
}

扩展完毕,接下来就是在发送消息的时候正式调用

//构造自定义消息格式(用户信息)
AddMessageInfo addMessageInfo = new AddMessageInfo();
addMessageInfo.setNickNameText(userName);
addMessageInfo.setIconText("http://image.baidu.com/search/detail?ct=503316480&z=0&ipn=false&word=%E5%A4%B4%E5%83%8F&hs=0&pn=9&spn=0&di=207790&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&ie=utf-8&oe=utf-8&cl=2&lm=-1&cs=3583433020%2C118316633&os=1895134963%2C172187008&simid=0%2C0&adpicid=0&lpn=0&ln=30&fr=ala&fm=&sme=&cg=head&bdtype=0&oriquery=%E5%A4%B4%E5%83%8F&objurl=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201810%2F18%2F20181018162951_kgwzm.thumb.700_0.jpeg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3B17tpwg2_z%26e3Bv54AzdH3Fks52AzdH3F%3Ft1%3D8aa0mddbb8&gsm=&islist=&querylist=");

//构造自定义消息格式(消息时间)
AddMessageDate addMessageDate = new AddMessageDate();
addMessageDate.setDateText(Util.getNewDate()); //此处自己去获取当前时间

//添加扩展到message
Message message = new Message();
message.setBody(inputMsg);		//此处inputMsg为发送的消息内容
message.addExtension(addMessageDate); //把扩展的消息时间节点加入到消息体中
message.addExtension(addMessageInfo);//把扩展的用户信息节点加入到消息体中
chat.send(message);  //最后直接调用就行

最后我们能看到实现的扩展效果

<message to='17761207344@xie-pc' id='ozgDG-82'>
<body>deeeeeeeeeee </body>
<date>2019-10-11 10:32:56</date>
<userinfo
xmlns="com.xml.extension">
<nickname>17761207347</nickname>
<icon>http://image.baidu.com/search/detail?ct=503316480&z=0&ipn=false&word=%E5%A4%B4%E5%83%8F&hs=0&pn=9&spn=0&di=207790&pi=0&rn=1&tn=baiduimagedetail&is=0%2C0&ie=utf-8&oe=utf-8&cl=2&lm=-1&cs=3583433020%2C118316633&os=1895134963%2C172187008&simid=0%2C0&adpicid=0&lpn=0&ln=30&fr=ala&fm=&sme=&cg=head&bdtype=0&oriquery=%E5%A4%B4%E5%83%8F&objurl=http%3A%2F%2Fb-ssl.duitang.com%2Fuploads%2Fitem%2F201810%2F18%2F20181018162951_kgwzm.thumb.700_0.jpeg&fromurl=ippr_z2C%24qAzdH3FAzdH3Fooo_z%26e3B17tpwg2_z%26e3Bv54AzdH3Fks52AzdH3F%3Ft1%3D8aa0mddbb8&gsm=&islist=&querylist=</icon>
</userinfo>
</message>

ps:
我相信,如果都已经扩展号发出去了,那么接收就更没问题了吧,就是获取各自的信息而已。但我们要特别注意的是,如果你是在用自己搭建的openfire和spark进行消息的往来测试,你会发现你根本没法发送自己扩展的消息格式,这是因为openfire和spark根本无法识别你的消息体,这就需要我们自己去写openfire服务器的插件,这样才能识别。

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