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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top