我在通过 XMPP 发送图像时遇到了一个问题。下面是我完成的代码 fragment 。我不知道代码有什么问题。
Message msg = new Message(emailId, Message.Type.chat);
ImageTransferExtension transfer = new ImageTransferExtension();
transfer.setImageName(mImageUri.getEncodedPath());
transfer.setUserRecipient(emailId);
msg.addExtension(transfer);
这是 ImagesTransferExtension 代码 fragment
编辑:
public class ImageTransferExtension implements PacketExtension {
private String userRecipient;
private String ftpUrl;
private String httpUrl;
private String id;
private String typeOfMessage;
private String fieldName;
private String duration;
@Override
public String getElementName() {
// TODO Auto-generated method stub
return "x";
}
@Override
public String getNamespace() {
// TODO Auto-generated method stub
return "jabber:client";
}
@Override
public String toXML() {
StringBuilder builder = new StringBuilder();
builder.append("<" + getElementName() + " xmlns=\"" + getNamespace()
+ "\">");
if (ftpUrl != null) {
builder.append("<ftpUrl>").append(ftpUrl).append("</ftpUrl>");
}
if (httpUrl != null) {
builder.append("<httpUrl>").append(httpUrl).append("</httpUrl>");
}
if (typeOfMessage != null) {
builder.append("<typeOfMessage>").append(typeOfMessage)
.append("</typeOfMessage>");
}
if (fieldName != null) {
builder.append("<fieldName>").append(fieldName)
.append("</fieldName>");
}
if (duration != null) {
builder.append("<duration>").append(duration).append("</duration>");
}
builder.append("</" + getElementName() + ">");
return builder.toString();
}
public String getUserRecipient() {
return userRecipient;
}
public void setUserRecipient(String userRecipient) {
this.userRecipient = userRecipient;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
我不知道在命名空间和元素中传递什么。我仔细阅读了文档,但没有找到解决方案。
最佳答案
您可以为您的自定义数据包使用任何名称和命名空间,但您的传出数据包的 XML 流应该是有效且格式正确的 XML 文档。 在您的示例中,我看到未绑定(bind)的 ftpurl、httpurl、imageName 节点。任何好的 XML/XMPP 解析器都会抛出错误,因为您的流格式不正确。通常的做法是 - 将所有自定义节点包装在一个顶级节点中并定义命名空间,如下所示:
<i xmlns="my:image:transfer">
<httpurl>http://my.image.jpg</httpurl>
<ftpurl>ftp://my/image.jpg</ftpurl>
</i>
这将导致 XML 解析器处理所有来自“my:image:transfer”命名空间的自定义 XML 节点,并且 XML 流将是有效的。
在“图像传输扩展”的上下文中 - 您正在尝试重新发明“带外”XMPP 文件传输,它具有众所周知的 XMPP 扩展 - http://xmpp.org/extensions/xep-0066.html
具有 OOB 扩展名的数据包如下所示:
<message from='stpeter@jabber.org/work'
to='MaineBoy@jabber.org/home'>
<body>Yeah, but do you have a license to Jabber?</body>
<x xmlns='jabber:x:oob'>
<url>http://www.jabber.org/images/psa-license.jpg</url>
<desc>Jabber license</desc>
</x>
</message>
此类负载的 Smack PacketExtension 应如下所示:
public class OutOfBandData implements PacketExtension {
String description;
String url;
@Override
public String getElementName() {
return "x";
}
@Override
public String getNamespace() {
return "jabber:x:oob";
}
@Override
public String toXML() {
StringBuilder builder = new StringBuilder();
builder.("<" + getElementName() + " xmlns=\"" + getNamespace() + "\">");
if (url != null) {
builder.append("<url>").append(url).append("</url>");
}
if (description != null) {
builder.append("<desc>").append(description).append("</desc>");
}
builder.append("</" + getElementName() + ">");
return builder.toString();
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getUrl() {
return url;
}
public void setUrl(String imageUrl) {
this.url = imageUrl;
}
这离您的实现不远了,但其他 XMPP 客户端了解您的“图像传输”的机会正在增加。
关于android - 通过 Asmack 发送图像时创建消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22372589/