Как установить / получить данные профиля с XMPP, используя Smack - PullRequest
4 голосов
/ 03 декабря 2009

Я работаю над клиентом XMPP на Android, используя библиотеку Smack. Составы сообщений / сообщений / присутствия работают очень хорошо. Однако я не нашел способа сохранить дополнительную информацию в профиле (userpicture, имя собаки, ...).

Единственный способ, который я вижу из поиска в Google, - это использование VCards. Но это просто не сработало. Я попробовал следующее:

        VCard vCard = new VCard();
        vCard.load(connection);
        vCard.setEmailHome("meine_home@email.de");
        vCard.setLastName("Scheller");
        vCard.setField("blafasel", "asdf");
        vCard.save(connection);

Тогда я искал способ просмотреть информацию о VCard. Он не отображался ни в iChat, ни в этом System.out:

        vCard.load(connection, user);
        System.out.println(user + " has this vCard: " + vCard.toXML());

Итак, что-то пошло не так, но нет никаких признаков того, что это было. Я попробовал это с сервером Google Talk и моей собственной копией openfire с тем же результатом. Кстати, я использую эту версию Smack: http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/

Что я здесь не так делаю? Как правильно хранить информацию, связанную с профилем, с помощью Smack?

Ответы [ 3 ]

12 голосов
/ 10 декабря 2009

Я проверил источник Smack и прошел важные части с помощью отладчика, а также использовал окно отладки Smack.Проблема в реализации VCard Smack API .Сохранение VCard работает, как описано, однако загрузка прерывается.

parseIQ (синтаксический анализатор XmlPullParser) является частью класса PacketReader.java и обрабатывает различные типы пакетов.Он обрабатывает только теги со следующими пространствами имен:

"jabber: iq: auth", "jabber: iq: roster", "jabber: iq: register", "urn: ietf: params: xml: ns:xmpp-bind "

Он также проверяет, есть ли в ProviderManager какой-либо зарегистрированный IQProvider.И это корень моей проблемы.ICProvider для VCards не зарегистрирован.Поэтому любая информация, находящаяся внутри тега vCard, просто удаляется.

Зарегистрировать этого IQProvider не так уж и сложно:

    ProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());

Это решило мой маленький пример, приведенный выше, для сохранения моей собственной vCardи скачивая его снова.У меня все еще есть проблемы с загрузкой визиток других пользователей ... Я собираюсь рассмотреть это поближе и, возможно, открыть другую ветку для этой проблемы.

3 голосов
/ 04 июля 2010

Вы можете использовать следующий код для получения информации.

VCard card = new VCard();
card.load(connection, "user@fqdn");
System.out.println("Voice: "+card.getPhoneHome("VOICE"));
2 голосов
/ 09 декабря 2009

Попробуйте сначала установить vCard для этого пользователя с другим клиентом и посмотрите, как это изменит ваши результаты. Для дальнейшей диагностики вам нужно включить отладку протокола в Smack (используйте «-Dsmack.debugEnabled=true» на настольном компьютере) и разместить соответствующие биты здесь.

...