【问题标题】:Can't save VCard using aSmack and Openfire无法使用 aSmack 和 Openfire 保存 VCard
【发布时间】:2014-03-15 15:24:10
【问题描述】:

我在 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 时,我没有收到错误,它只是没有保存它!

有人遇到同样的问题吗?

【问题讨论】:

    标签: java openfire smack asmack vcf-vcard


    【解决方案1】:

    我认为问题可能是您需要指定您创建的 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();
    }
    

    【讨论】:

    • 您是否尝试过使用 aSmack 而不是 Smack 来做同样的事情?我认为我的问题可能是 aSmack 所特有的
    • 我已经尝试过使用 aSmack。它适用于当前登录的用户。当您尝试更改另一个 vCard 时......它仍然会更新当前登录用户的 vCard。根据文档,这是正确的行为。这是混乱之王,但您不能修改除您之外的其他人的 vCard 是有道理的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多