我想发送
<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);
但是没有收到任何数据包。调用此方法后,每次关闭我的连接。我已经完成了许多教程,但无法找到任何解决方案......告诉我哪里错了。
答案 0 :(得分:4)
Smack肯定有一种更好的XML处理方式,而不是修改字符串表示的方法。如果任何内容包含"
或需要作为属性进行转义的任何其他字符,则会严重中断。
您必须将自定义有效内容作为消息中的单独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。