2014-03-13 70 views
1
發送圖片

有同時通過XMPP.Below發送圖像,我面對的是代碼的問題片段,我都做。我不知道代碼有什麼問題。新建信息,同時通過Asmack

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

這裏是ImagesTransferExtension代碼片斷

編輯:

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

}

我不知道是什麼在命名空間和元素通過。我瀏覽了文檔,但沒有找到解決方案。

+1

請讓我知道這個問題出了什麼問題。反饋意見將幫助我解決問題,而不僅僅是提供一個downvote –

回答

2

您可以使用任何名稱和命名空間爲您的自定義數據包,但你的輸出數據包的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解析器來對待,因爲他們從「我所有的自定義XML節點:圖片:轉移「名稱空間和XML流將是有效的。

在你的「圖像傳輸擴展」的背景下 - 你是想重塑「出帶外」 XMPP文件傳輸,這已衆所周知的XMPP擴展 - http://xmpp.org/extensions/xep-0066.html

包與OOB擴展的樣子即:

<message from='[email protected]/work' 
     to='[email protected]/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> 

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

這是從你的IMPL不遠但其他XMPP客戶理解您的「圖像傳輸」的機會正在增加。

+0

感謝您的答覆。我會立即嘗試 –

+0

@vitalyseter:我剛剛修改了Package擴展名爲u的共享。是的,我做了。 –

+0

請檢查編輯現在是否好? –