Android 通过Asmack发送图像时创建消息

Android 通过Asmack发送图像时创建消息,android,xmpp,asmack,Android,Xmpp,Asmack,在通过XMPP发送图像时,我面临一个问题。下面是我完成的代码片段。我不知道代码出了什么问题 Message msg = new Message(emailId, Message.Type.chat); ImageTransferExtension transfer = new ImageTransferExtension(); transfer.setImageName(mImageUri.getEncodedPath());

在通过XMPP发送图像时,我面临一个问题。下面是我完成的代码片段。我不知道代码出了什么问题

Message msg = new Message(emailId, Message.Type.chat);
            ImageTransferExtension transfer = new ImageTransferExtension();
            transfer.setImageName(mImageUri.getEncodedPath());
            transfer.setUserRecipient(emailId);
            msg.addExtension(transfer);
这是ImageStransPerExtension代码片段

编辑:

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;
}
公共类ImageTransferExtension实现PacketExtension{
私有字符串userRecipient;
私有字符串ftpUrl;
私有字符串httpUrl;
私有字符串id;
私有字符串类型的消息;
私有字符串字段名;
私有字符串持续时间;
@凌驾
公共字符串getElementName(){
//TODO自动生成的方法存根
返回“x”;
}
@凌驾
公共字符串getNamespace(){
//TODO自动生成的方法存根
返回“jabber:client”;
}
@凌驾
公共字符串toXML(){
StringBuilder=新的StringBuilder();
生成器。追加(“”);
如果(ftpUrl!=null){
builder.append(“”).append(ftpUrl.append(“”);
}
if(httpUrl!=null){
builder.append(“”).append(httpUrl.append(“”);
}
if(typeOfMessage!=null){
builder.append(“”).append(typeOfMessage)
.附加(“”);
}
if(fieldName!=null){
builder.append(“”).append(字段名)
.附加(“”);
}
if(持续时间!=null){
builder.append(“”)。append(持续时间)。append(“”);
}
生成器。追加(“”);
返回builder.toString();
}
公共字符串getUserRecipient(){
返回用户收件人;
}
public void setUserRecipient(字符串userRecipient){
this.userRecipient=userRecipient;
}
公共字符串getId(){
返回id;
}
公共无效集合id(字符串id){
this.id=id;
}
}


我不知道在名称空间和元素中传递什么。我浏览了文档,但没有找到解决方案。

您可以为自定义数据包使用任何名称和命名空间,但传出数据包的XML流应该是有效且格式良好的XML文档。 在您的示例中,我看到了未绑定的ftpurl、httpurl、imageName节点。任何好的XML/XMPP解析器都会抛出错误,因为您的流格式不好。常见做法是-将所有自定义节点包装在一个顶级节点中并定义命名空间,如下所示:

<i xmlns="my:image:transfer">
 <httpurl>http://my.image.jpg</httpurl>
 <ftpurl>ftp://my/image.jpg</ftpurl>
</i>

http://my.image.jpg
ftp://my/image.jpg
这将导致XML解析器处理所有自定义XML节点,因为它们来自“my:image:transfer”命名空间,XML流将是有效的

在“图像传输扩展名”的上下文中,您正在尝试重新创建“带外”XMPP文件传输,该文件传输具有众所周知的XMPP扩展名-

具有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>

是的,但是你有说话的执照吗?
http://www.jabber.org/images/psa-license.jpg
闲聊执照
此类有效载荷的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;
    }
public类OutOfBandData实现PacketExtension{
字符串描述;
字符串url;
@凌驾
公共字符串getElementName(){
返回“x”;
}
@凌驾
公共字符串getNamespace(){
返回“jabber:x:oob”;
}
@凌驾
公共字符串toXML(){
StringBuilder=新的StringBuilder();
建造商(“);
如果(url!=null){
builder.append(“”).append(url.append(“”);
}
if(说明!=null){
builder.append(“”)。append(description)。append(“”);
}
生成器。追加(“”);
返回builder.toString();
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
公共字符串getUrl(){
返回url;
}
公共void setUrl(字符串imageUrl){
this.url=imageUrl;
}

这离您的实现不远了,但是其他XMPP客户机可能理解您的“图像传输”正在增长。

请让我知道问题的症结所在。对问题的反馈将帮助我解决问题,而不仅仅是给出一个答案downvote@vitalyseter:我刚刚修改了u共享的软件包扩展。我这样做对吗?看起来还好,你现在有什么问题?这是我从Iphone端得到的:不要使用
jabber:client
作为名称空间,它是
iq
message
presence
节点的预定义名称空间。您仍然没有将自定义节点包装在一个顶级节点中。您还没有将自定义节点包装在一个顶级节点中。您可以向我解释一下吗