2014-02-16 7 views
2

У меня возникла проблема с созданием VCard на aSmack. Я вижу, что моя VCard не была сохранена, когда я пытаюсь ее загрузить.Не удается сохранить VCard с помощью aSmack и Openfire

  • Когда я пытаюсь загрузить VCard, созданную другим клиентом, все работает отлично.
  • Когда я пытаюсь загрузить VCard от пользователя, созданного на Openfire, я получаю следующее сообщение об ошибке:

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), это не представляется возможным изменить VCard если мы используем LDAP. Но я не получаю ошибок, когда пытаюсь сохранить VCard, это просто не спасает!

У кого-то есть такая же проблема?

ответ

3

Я думаю, что проблема может быть, что вам нужно указать, кто визитную карточку вы создали принадлежит:

  • для текущего пользователя, воспользуйтесь vcard.load(conn)
  • для любого пользователя вашей службы, используйте vcard.load(conn, username) где username должно быть полное имя пользователя, т.е. [email protected]

Я тестировал этот код и все работает отлично:

// 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 [email protected] 
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(); 
} 
+0

Вы пытались сделать то же самое с помощью aSmack вместо Smack? Я думаю, что моя проблема может быть специфичной для aSmack – Caroline

+0

Я пробовал с aSmack. Он отлично работает с текущим пользователем. И когда вы пытаетесь изменить другую vCard ... она по-прежнему обновляет vCard текущего зарегистрированного пользователя. Что соответствует документам, правильное поведение. Это король путаницы, но имеет смысл, что вы не можете изменить vCard кого-то другого, кроме вас. –