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服务器的插件,这样才能识别。
相关文章推荐
- Android 修改Message的body格式,用以存放消息时间等-smack:4.3.4
- android studio svn检出、提交代码时一直弹出输入svn用户信息
- android应用SharedPreferences的使用(保存用户的个性化配置信息)
- Android开发实现QQ登陆并获取信息、分享消息到QQ
- spring security 3.0 的 用户详细信息的 session 扩展 (基于rapid framework)
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android基于XMPP Smack Openfire下学习开发IM(四)单人聊天和多人聊天(发送消息、接收消息)
- Android 环信IM即时通讯 自定义扩展消息 注意点
- WordPress 加载特殊模版文件 以及 扩展用户信息函数
- 【Android 开发】: Android 消息处理机制之二: Message 中 obtain()源代码剖析
- Android之消息机制Handler,Looper,Message解析
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- Android消息机制源码分析--Lopper,Handler,Message
- Android:消息处理机制(Handler,Message,Looper)分析
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- android的消息处理机制(图文+源码分析)—Looper/Handler/Message
- android用户信息保存
- Android基于XMPP Smack openfire 开发的聊天室(二) 【聊天信息、成员】
- 使用HttpClient 4.3.4 自动登录并抓取中国联通用户基本信息和账单数据,GET/POST/Cookie