Как установить / получить данные профиля с помощью XMPP с помощью Smack
Вопрос
Я работаю над 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
" на настольном компьютере), и разместите соответствующие фрагменты здесь.