前言
参考:
怎么自定义message格式?
好了,下面正文:
正文
请看下面的伪代码,
Message message = new Message();
message.setStanzaId("923442621149");
message.setType(Message.Type.normal);
message.setBody("shanraisshan");
Log.e("message --->", message.toXML().toString());
在smack里面如果你想要发送消息,那么就可能是上面这样设置,那么发送时候输出的格式是什么呢?
如下:
<message id='923442621149' type='chat'>
<body>shanraisshan</body>
</message>
不过,或者,如果要做一个已读回执的功能,需要用到下面的自定义格式:
<message id='923442621149' type='chat'>
<body>1</body>
<received xmlns='urn:xmpp:receipts' id='chat-WN-CSemD6q9-androidHD-e1z3uuUv'/>
</message>
那么怎么办?
留意看看上面的这一段:
<received xmlns='urn:xmpp:receipts' id='chat-WN-CSemD6q9-androidHD-e1z3uuUv'/>
其实这就是自定义扩展元素了。
其中
元素名称为received
命名空间xmlns为:urn:xmpp:receipts,
额外还多一个id元素,这个元素用来标识,到底是哪一条消息的id,给客户端判断。
下面说说具体实现。
具体代码实现
package net.w2p.LibClientExt.xmpp.stanzas;
import org.jivesoftware.smack.packet.DefaultExtensionElement;
import org.jivesoftware.smack.packet.ExtensionElement;
import org.jivesoftware.smack.provider.EmbeddedExtensionProvider;
import org.jivesoftware.smack.util.XmlStringBuilder;
import java.util.List;
import java.util.Map;
/**
* https://stackoverflow.com/questions/32940874/custom-extension-element-in-stanza-for-smack-4-1-4/39364219#39364219
*/
public class ReplyExtension implements ExtensionElement {
public static final String NAMESPACE = "urn:xmpp:receipts";
public static final String ELEMENT = "received";
String attr_id = null;
static final String ATTRIBUTE_REPLY_TEXT = "id";
@Override
public String getElementName() {
return ELEMENT;
}
@Override
public String getNamespace() {
return NAMESPACE;
}
@Override
public CharSequence toXML(String enclosingNamespace) {
XmlStringBuilder xml = new XmlStringBuilder(this);
xml.attribute(ATTRIBUTE_REPLY_TEXT, getAttrId());
xml.closeEmptyElement();
return xml;
}
// @Override
// public XmlStringBuilder toXML() {
// XmlStringBuilder xml = new XmlStringBuilder(this);
// xml.attribute(ATTRIBUTE_REPLY_TEXT, getAttrId());
// xml.closeEmptyElement();
// return xml;
// }
//__________________________________________________________________________________________________
public void setAttrId(String _rText) {
attr_id = _rText;
}
public String getAttrId() {
return attr_id;
}
//__________________________________________________________________________________________________
public static class Provider extends EmbeddedExtensionProvider<ReplyExtension> {
@Override
protected ReplyExtension createReturnExtension(String currentElement, String currentNamespace, Map<String, String> attributeMap, List<? extends ExtensionElement> content) {
ReplyExtension repExt = new ReplyExtension();
repExt.setAttrId(attributeMap.get(ATTRIBUTE_REPLY_TEXT));
return repExt;
}
}
}
注册一下处理方案:
static{
//--注册一下扩展元素。
ProviderManager.addExtensionProvider(ReplyExtension.ELEMENT,
ReplyExtension.NAMESPACE, new ReplyExtension.Provider());
}
然后这样发送:
/****
* 发送消息回执
* ***/
public void sendReceiptReply(Jid from,Jid to,String msgId){
if(from==null||to==null){
return;
}
if(ValidateUtils.isEmpty(msgId)){
return;
}
Message message = new Message();
message.setFrom(from);
message.setTo(to);
message.setStanzaId(WebTools.randomUUID());//--随机id
message.setType(Message.Type.chat);
message.setBody("1");
//adding custom reply extension
ReplyExtension repExt = new ReplyExtension();
repExt.setAttrId(msgId);
message.addExtension(repExt);
// Log.e("message --->", message.toXML().toString());
try {
//--放入队列等待发送。
queue.offer(message);
//如果你不用队列,那么请直接使用:
// if(this.conn!=null){
// this.conn.sendStanza(message);
// }
} catch (Exception e) {
e.printStackTrace();
}
}
接收消息是这样处理的:
/***
* 消息回执检测
*
* ***/
/****
* <message xmlns='jabber:client' to='1000@developing.com/androidHD'
* from='1000@developing.com' type='normal'>
* <received xmlns='urn:xmpp:receipts' id='chat-WN-CSejHDpQ-androidHD-Nn72XLH6'/>
* </message>
* ****/
final ExtensionElement tmpPacketExt = packet.
getExtension(ReplyExtension.NAMESPACE);
ReplyExtension repExt = (ReplyExtension)tmpPacketExt;
if(repExt!=null) {
final Jid _from = packet.getFrom();
final Jid _to = packet.getTo();
logger.info("需要执行已读回执。");
logger.info(repExt.toXML("")+"");
sendReceiptReply(_to,_from,repExt.getAttrId());
return;
}