Как установить / получить данные профиля с помощью XMPP с помощью Smack

StackOverflow https://stackoverflow.com/questions/1838770

  •  12-09-2019
  •  | 
  •  

Вопрос

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

Единственный способ, который я вижу в 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);

Затем я искал способ просмотреть информацию об этой визитной карточке.Он не появился ни в iChat, ни в этой Системе.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?

Это было полезно?

Решение

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

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

"jabber: iq: аутентификация", "jabber: iq: реестр", "jabber: iq: регистрация", "urn:ietf:параметры:xml:ns:xmpp-привязка"

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

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

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

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

Другие советы

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

VCard card = new VCard();
card.load(connection, "user@fqdn");
System.out.println("Voice: "+card.getPhoneHome("VOICE"));

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top