Android IQ自定义扩展(smack-4.1.9)
本文是基于smack-4.1.9上的IQ自定义扩展。别的版本如有区别应该也是在继承IQ后,重写方法上的区别。
首先,来看看需要扩展的IQ的格式
<iq type="set" to="089eb8e3-dca8-40a3-90e8-aa560099ab45@conference.win-arbj87ei5km" id="089eb8e3-dca8-40a3-90e8-aa560099ab45">
//查询节点
<query xmlns="http://jabber.org/protocol/muc#owner">
//销毁节点
<destroy id="dispose">
//销毁的原因节点
<reason>{
"optUser" : "李俊超",
"Function" : "Func_DeleteRoom",
"RoomName" : "铭",
"OptId" : "04eb8257-927b-4605-94a5-aa0d00996bf1"
}
</reason>
</destroy>
</query>
</iq>
接下来,新建IQMessage ,继承IQ
相关注释已在代码里面标注。
import org.jivesoftware.smack.packet.IQ;
public class IQMessage extends IQ {
private String groupId,groupName,userId,userName;
/**
*
* @param childElementName 代表query节点
* @param childElementNamespace 代表query节点的xmlns
* @param groupId 群id
* @param groupName 群名称
* @param userId 操作者id
* @param userName 操作者名称
*/
public IQMessage(String childElementName, String childElementNamespace,String groupId, String groupName,String userId,String userName){
super(childElementName,childElementNamespace);
this.groupId = groupId;
this.groupName = groupName;
this.userId = userId;
this.userName = userName;
}
/**
*
* @param xml IQ格式拼接
* @return
*/
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml) {
xml.rightAngleBracket(); //">"括号
xml.append("<destroy id=\"dispose\" >")
.append("<reason>{" +
" \"optUser\" : \""+userName+"\"," +
" \"Function\" : \"Func_DeleteRoom\"," +
" \"RoomName\" : \""+groupName+"\"," +
" \"OptId\" : \""+userId+"\"" +
" }")
.append("</reason>")
.append("</destroy>");
//以上都是数据格式的拼接
return xml;
}
}
紧接着,看看上层对自定义IQ的调用
/**
* 解散群聊
* @param toUserID
* @param loginUserId
*/
private void deleteGroup(final String toUserID,String loginUserId){
try {
String userName = AppPrefs.get(this).getChatLogn().UserName;
//XmppConfig.sendIqDeleteGroupUser(mContext,toUserID,groupName,loginUserId,userName);
IQMessage msg = new IQMessage("query","http://jabber.org/protocol/muc#owner", groupId, groupName, loginUserId, userName);
msg.setTo(groupId+"@conference.win-arbj87ei5km"); //设置iq节点里面的to
msg.setStanzaId(groupId); //设置iq节点里面的iq
msg.setType(IQ.Type.set); //设置iq节点里面的type
XmppConfig.getInstance(mContext).sendStanza(msg); //消息发送
deleteGroupHistory(toUserID,loginUserId);
} catch (Exception e) {
Log.e("deleteGroup","Exception: "+e.toString());
}
}
最后我们可以通过msg.toXML()来查看扩展拼接后的IQ格式。
<iq to='1fbb140c-30ef-4afc-b54d-aa5a00f0192f@conference.win-arbj87ei5km' id='1fbb140c-30ef-4afc-b54d-aa5a00f0192f' type='set'>
<query xmlns='http://jabber.org/protocol/muc#owner'>
<destroy id="dispose" >
<reason>{
"optUser" : "xiejinbo",
"Function" : "Func_DeleteRoom",
"RoomName" : "room_xiejinbo",
"OptId" : "2ace1328-24f4-4efc-9839-aa1b00db5181"
}</reason>
</destroy>
</query>
</iq>