Como definir / obter dados do perfil com XMPP usando Bater
Pergunta
Eu estou trabalhando em um cliente XMPP no Android, usando a biblioteca Bater. O material roster / mensagens / presença está funcionando muito bem. No entanto, eu não encontrar uma maneira de armazenar informações adicionais perfil (userpicture, o nome dos cães, ...).
A única maneira que vejo de googling está usando VCards. Mas ele simplesmente não funcionou. Eu tentei o seguinte:
VCard vCard = new VCard();
vCard.load(connection);
vCard.setEmailHome("meine_home@email.de");
vCard.setLastName("Scheller");
vCard.setField("blafasel", "asdf");
vCard.save(connection);
Então eu estava procurando uma maneira de ver essa informação VCard. Ele tinha nem aparecer no iChat, nem neste System.out:
vCard.load(connection, user);
System.out.println(user + " has this vCard: " + vCard.toXML());
Então, qualquer coisa deu errado, mas não há nenhuma indicação de que se tratava. Eu tentei isso com o servidor do Google Talk e minha própria cópia do openfire com o mesmo resultado. Btw, eu estou usando esta versão do Bater: http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/
O que estou fazendo de errado aqui? O que é a maneira correta de armazenar informações relacionadas perfil com Bater?
Solução
Eu verifiquei a fonte de heroína e atravessou as partes importantes com um depurador, bem como utilizando a janela de depuração smack. O problema é dentro da implementação VCard do Bater API . Guardar um trabalho VCard faz como descrito, no entanto, o carregamento está quebrado.
parseIQ (analisador XmlPullParser) faz parte da classe PacketReader.java e alças diferentes tipos de pacotes. Ele só lida com as etiquetas com os seguintes namespaces:
"jabber: qi: auth", "Jabber: qi: roster", "Jabber: qi: registrar", "Urn: IETF: Parâmetros: xml: ns: xmpp-bind"
Também parece se houver qualquer IQProvider registrada na ProviderManager. E esta é a raiz do meu problema. Não há IQProvider para VCards registrados. Então, o que informação está dentro da tag vCard simplesmente fica descartada.
Não é muito difícil de registrar este IQProvider entanto:
ProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());
Isso resolveu o meu pequeno exemplo acima para salvar minha própria vCard e baixá-lo novamente. Eu ainda estou tendo problemas com o download de outros vCards usuários ... vamos ter um olhar mais atento para isso e talvez abrir outro segmento para essa questão.
Outras dicas
Você pode usar o código a seguir para obter informações.
VCard card = new VCard();
card.load(connection, "user@fqdn");
System.out.println("Voice: "+card.getPhoneHome("VOICE"));
Tente configurar um vCard para esse usuário com outro cliente em primeiro lugar, e ver como isso muda seus resultados. A fim de diagnosticar mais, você vai precisar para ligar protocolo de depuração em Bater (use "-Dsmack.debugEnabled=true
" em uma máquina desktop), e postar as partes relevantes aqui.