如何在 XMPP 节/数据包的 <message> 元素中添加自定义字段?

BST*_*aal 4 android xmpp

我要发送

<message id="qm5Dx-8"
 to="abc"
 type="chat" 
 from="abc"
 msgType="2"
 msgTimeStamp="1413971599039"
 fileSize="18 MB" 
 fileHeight="300"
 fileWidth="300"
 thumbnail="abc"
 mediaURL=""
 serverMediaURL="xyz"
 isFromMe="1"
 status="1"><body>Image</body><request xmlns='urn:xmpp:receipts'/></message>
Run Code Online (Sandbox Code Playgroud)

我构建自定义消息的方式是:

public class MyCustomMessage  extends Message{

    public MyCustomMessage(){
        super();
    }

    public MyCustomMessage(String to, Type type){
        super(to, type);
    }
    private String msgType ;
    private String msgTimeStamp ;
    private String isFromMe ;
    private String status ;
    private String mediaURL ;
    private String serverMediaURL ;
    private String fileSize ;
    private String fileHeight ;
    private String fileWidth ;
    private String thumbnail ;

    @Override
    public String toXML() {
        String XMLMessage = super.toXML();
        String XMLMessage1 = XMLMessage.substring(0, XMLMessage.indexOf(">"));
        String XMLMessage2 = XMLMessage.substring(XMLMessage.indexOf(">"));

        if (this.msgType != null) {
            XMLMessage1 += " msgType=\"" + this.msgType + "\"";
        }
        if (this.msgTimeStamp != null) {
            XMLMessage1 += " msgTimeStamp=\"" + this.msgTimeStamp + "\"";
        }
        if (this.fileSize != null) {
            XMLMessage1 += " fileSize=\"" + this.fileSize + "\"";
        }
        if (this.fileHeight != null) {
            XMLMessage1 += " fileHeight=\"" + this.fileHeight + "\"";
        }
        if (this.fileWidth != null) {
            XMLMessage1 += " fileWidth=\"" + this.fileWidth + "\"";
        }
        if (this.thumbnail != null) {
            XMLMessage1 += " thumbnail=\"" + this.thumbnail + "\"";
        }
        if (this.mediaURL != null) {
            XMLMessage1 += " mediaURL=\"" + this.mediaURL + "\"";
        }
        if (this.serverMediaURL != null) {
            XMLMessage1 += " serverMediaURL=\"" + this.serverMediaURL + "\"";
        }
        if (this.isFromMe != null) {
            XMLMessage1 += " isFromMe=\"" + this.isFromMe + "\"";
        }
        if (this.status != null) {
            XMLMessage1 += " status=\"" + this.status + "\"";
        }

        return XMLMessage1 + XMLMessage2;
    }

// Setters Getters of all these fields..

}
Run Code Online (Sandbox Code Playgroud)

然后在 SmackableImplement 类中添加必填字段后,我调用mXMPPConnection.sendPacket(customMessage);

但我没有收到任何数据包。每次调用此方法后,我的连接都会关闭。我已经浏览了很多教程,但找不到任何解决方案...告诉我哪里出错了。

xny*_*hps 5

  1. 与修改字符串表示的方法相比,Smack 肯定有更好的方法来处理 XML。当任何包含 a"或任何其他需要作为属性转义的字符时,这将严重破坏。

  2. 您必须将自定义有效负载作为消息中单独的 XML 元素添加到消息中,而不是作为消息的属性。您的 XML 应如下所示:

     <message id="qm5Dx-8" to="abc" type="chat" from="abc">
        <body>Image</body>
        <request xmlns='urn:xmpp:receipts'/>
        <data xmlns='http://bstkaal/custom/data'
          msgType="2"
          msgTimeStamp="1413971599039"
          fileSize="18 MB" 
          fileHeight="300"
          fileWidth="300"
          thumbnail="abc"
          mediaURL=""
          serverMediaURL="xyz"
          isFromMe="1"
          status="1" />
    </message>
    
    Run Code Online (Sandbox Code Playgroud)