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

时间:2014-10-22 12:44:28

标签: 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>

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

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..

}

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

但是没有收到任何数据包。调用此方法后,每次关闭我的连接。我已经完成了许多教程,但无法找到任何解决方案......告诉我哪里错了。

2 个答案:

答案 0 :(得分:4)

  1. Smack肯定有一种更好的XML处理方式,而不是修改字符串表示的方法。如果任何内容包含"或需要作为属性进行转义的任何其他字符,则会严重中断。

  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>
    

答案 1 :(得分:2)

xnyhps回答是正确的。我只是想添加一些东西。他已经说过了,但我不能强调这个事实,因为我一次又一次地看到它:

永远不要将自定义值添加到指定的流元素属性(例如,消息的type属性的新值),并且永远不要将新属性添加到顶级元素(就像您使用msgType所做的那样,{{ 1}}等等。

这有可能打破局面!不要这样做。另见"XEP-0134: XMPP Design Guidelines § 2.1 XMPP is Sacred"。这就是Smack无法实现的原因。相反,使用自定义扩展元素,如xnyhps在其示例中显示的(msgTimeStamp元素)。另请参阅"RFC 6120 § 8.4 Extended Content"这些在Smack中称为PacketExtension