寫此文是爲了記念我耗時兩天的Smack庫應用開發。app
太苦惱了,網上找了一堆材料,關於XMPP的消息擴展方面的資料感受都是出於同一個源頭,基本問題仍是基於的庫版本都是低於4.1版本的講解。ide
我是在Smack4.3版本上作應用開發的,因此即使看到這些資料對Message 和Extension的概念闡述已經頗爲詳細和易懂了,可是在個人項目中就是沒法成功發送和接收到自定義消息擴展。ui
固然,咱們這裏不賣關子,直接指明:根本緣由是Smack4.2及之後版本對於擴展消息的XML書寫更規範了,之前的寫法就不合乎它的要求了。故而,發送端發不出擴展消息XML標籤內容、接收端只能收到body消息體。this
多說無益,這裏把須要注意的關鍵代碼列出了,但願能幫助到有須要的朋友們!spa
咱們的擴展消息定義:code
public class MyMessage implements ExtensionElement {
public static final String NAME = "xxx-demo";
public static final String NAME_SPACE = "xmpp:xxx:extension";
private String id = "";
private Integer status = 0;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String getElementName() {
return NAME;
}
@Override
public String getNamespace() {
return NAME_SPACE;
}
@Override
public CharSequence toXML(String var1) {
StringBuilder buffer = new StringBuilder();
buffer.append("<");
buffer.append(NAME);
buffer.append(" ");
buffer.append("xmlns='");
buffer.append(NAME_SPACE);
buffer.append("'");
buffer.append(">");
buffer.append("<").append("id").append(">").append(id).append("</").append("id").append(">");
buffer.append("<").append("status").append(">").append(status.toString()).append("</").append("status").append(">");
buffer.append("</");
buffer.append(NAME);
buffer.append(">");
return buffer;
}
}
咱們的擴展消息解碼器xml
public class MyProvider extends ExtensionElementProvider { @Override public MyMessage parse(XmlPullParser parser, int initialDepth) throws Exception { boolean done = false; MyMessage mymsg = new MyMessage(); while (!done) { int eventType = parser.next(); String name = parser.getName();//XML Tab標籤 if (eventType == XmlPullParser.START_TAG) { if (name.equals("id")) { mymsg.setId(parser.nextText()); } if (name.equals("status")) { mymsg.setStatus(Integer.parseInt(parser.nextText().trim())); } } if (eventType == XmlPullParser.END_TAG) { if (MyMessage.NAME.equals(name)) { done = true; } } } return mymsg; }}最後:我這裏不是完整XMPP技術的介紹,也不是XMPP自定義消息的講解,只是假定你是XMPP技術應用開發者、之前用過XMPP自定義消息方面的功能、且是Java語言陣營的一員,那麼,對於這個問題你只須要看看我給出的這部分代碼,應該就能搞定Smack庫升級應用的問題了。---感謝關注,再會!