无法使用sSck和Openfire保存VCard

时间:2014-02-16 11:10:41

标签: java openfire smack asmack vcard

我在aSmack上创建VCard时遇到问题。我可以看到,当我尝试加载它时,我的VCard还没有保存。

  • 当我尝试加载由另一个客户端创建的VCard时,一切都运行良好。
  • 当我尝试从在Openfire上创建的用户加载VCard时,出现以下错误:

service-unavailable(503) at org.jivesoftware.smackx.packet.VCard.doLoad(VCard.java:568) at org.jivesoftware.smackx.packet.VCard.load(VCard.java:551)

  • 当我尝试从我使用客户端创建的用户加载VCard时,出现以下错误:

remote-server-not-found(404) at org.jivesoftware.smackx.packet.VCard.doLoad(VCard.java:568) at org.jivesoftware.smackx.packet.VCard.load(VCard.java:551)

要从我的客户端创建VCard,首先我登录然后使用以下代码:

VCard userCard = new VCard();
userCard.setField("customField", "yes");
try {
    userCard.save(mConnection);
    Log.i(TAG,"usercard saved "+userCard.toXML()); /* it is displayed! */
} catch (XMPPException e) {
    Log.e(TAG,"An error occured while sending Vcard"+userCard.toXML(),e);
}

在连接mConnection之前,我添加了行ProviderManager.getInstance().addIQProvider("vCard","vcard-temp", new VCardProvider());

根据这篇文章(http://community.igniterealtime.org/thread/34689),如果我们使用LDAP,则无法修改VCard。但是当我尝试保存VCard时我没有出错,它只是不保存它!

有没有人有同样的问题?

1 个答案:

答案 0 :(得分:3)

我认为问题可能是您需要指定您创建的vCard属于谁:

  • 对于当前登录的用户,请使用vcard.load(conn)
  • 对于您服务的任何用户,请使用vcard.load(conn, username)其中username应为完整用户名,即login@host.tld

我测试了这段代码,一切正常:

// Load vCard of logged in user
private void loadVCard(XMPPConnection conn) {
    VCard vcard = new VCard();
    vcard.load(conn);

    vcard.setFirstName("Foo");
    vcard.setAvatar(imageBytes("http://example.com/avatarjpg"), "image/jpeg");
    vcard.save(conn);
}

// Load vCard of give user
// username: ex mylogin@chat.myservice.com
private void loadVCard(XMPPConnection conn, String username) {
    VCard vcard = new VCard();
    vcard.load(conn, username);

    byte[] avatarBytes = vcard.getAvatar();
    OutputStream out = new FileOutputStream(username + ".jpg");
    out.write(avatarBytes);
    out.close();
}