2009-12-03 2 views
4

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

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

 VCard vCard = new VCard(); 
     vCard.load(connection); 
     vCard.setEmailHome("me[email protected]"); 
     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()); 

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

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

ответ

12

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

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

"JABBER: Iq: AUTH", "JABBER: Iq: список", "болтовня: Iq: зарегистрировать", «урны: IETF: Params: XML: нс : xmpp-bind "

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

Это не слишком трудно зарегистрировать IQProvider хотя:

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

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

+0

Привет @UlrichScheller Я могу сэкономить и загрузить свою собственную визитную карточку, но я не могу загрузить другие пользователи vcards. Я получаю ответ, не реализованный. Есть идеи? У тебя есть? благодаря –

2

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

+0

Спасибо, режим отладки определенно помог мне отслеживать эту проблему. –

3

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

VCard card = new VCard(); 
card.load(connection, "[email protected]"); 
System.out.println("Voice: "+card.getPhoneHome("VOICE")); 

 Смежные вопросы

  • Нет связанных вопросов^_^