【问题标题】:Create message while sending Image through Asmack通过 Asmack 发送图像时创建消息
【发布时间】:2014-03-13 08:09:03
【问题描述】:

我在通过 XMPP 发送图像时遇到了一个问题。下面是我完成的代码 sn-p。我不知道代码有什么问题。

Message msg = new Message(emailId, Message.Type.chat);
            ImageTransferExtension transfer = new ImageTransferExtension();
            transfer.setImageName(mImageUri.getEncodedPath());
            transfer.setUserRecipient(emailId);
            msg.addExtension(transfer);

这里是 ImagesTransferExtension 代码 sn-p

编辑:

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;
}

}

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

【问题讨论】:

  • 请让我知道这个问题有什么问题。对它的反馈将帮助我解决它,而不仅仅是投反对票

标签: android xmpp asmack


【解决方案1】:

您可以为您的自定义数据包使用任何名称和命名空间,但您的传出数据包的 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>

这将导致 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 客户端了解您的“图像传输”的机会正在增加。

【讨论】:

  • @vitalyseter : 我刚刚修改了你共享的包扩展名。我这样做对吗?
  • 看起来不错,你现在有什么问题?
  • 这是我从 Iphone 端得到的:
  • NOT 使用jabber:client 作为命名空间,它是iqmessagepresence 节点的预定义命名空间。而且您仍然没有将自定义节点包装在一个顶级节点中。
  • 而且您仍然没有将自定义节点包装在一个顶级节点中。你能给我解释一下吗
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
  • 2020-12-09
相关资源
最近更新 更多