Pregunta

Estoy trabajando en un cliente XMPP en Android, utilizando la biblioteca Smack. La lista de cosas / mensajería / presencia está funcionando muy bien. Sin embargo, no he encontrado una manera de almacenar información de su perfil (userpicture, el nombre de los perros, ...).

La única forma que veo de google está utilizando VCards. Pero simplemente no funcionó. He intentado lo siguiente:

        VCard vCard = new VCard();
        vCard.load(connection);
        vCard.setEmailHome("meine_home@email.de");
        vCard.setLastName("Scheller");
        vCard.setField("blafasel", "asdf");
        vCard.save(connection);

A continuación, yo estaba buscando una manera de ver que la información vCard. No pasó ni aparece en iChat ni en este System.out:

        vCard.load(connection, user);
        System.out.println(user + " has this vCard: " + vCard.toXML());

Así que cualquier cosa que salió mal, pero theres ninguna indicación de lo que era. He intentado esto con el servidor de Google Talk y mi propia copia de Openfire con el mismo resultado. Por cierto, estoy usando esta versión de Polémica: http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/

¿Qué estoy haciendo mal aquí? ¿Cuál es la forma correcta de almacenar información relacionada con el perfil del tortazo?

¿Fue útil?

Solución

He comprobado la fuente de Smack y fue a través de las partes importantes con un depurador, así como el uso de la ventana de depuración Smack. El problema está dentro de la aplicación vcard de la API Smack. Almacenamiento de una VCard funciona como se describe, sin embargo, la carga está roto.

parseIQ (analizador XmlPullParser) es parte de la clase PacketReader.java y maneja diferentes tipos de paquetes. Sólo se ocupa de etiquetas con los siguientes espacios de nombres:

"jabber: iq: auth", "Jabber: iq: lista", "Jabber: iq: registrar", "Urn: ietf: params: xml: ns: xmpp-bind"

También se ve si hay alguna IQProvider registrada en el ProviderManager. Y esta es la raíz de mi problema. No hay ninguna IQProvider para VCards registrados. Así que toda la información que se encuentra dentro de la etiqueta vCard simplemente se cae.

No es demasiado difícil de registrar este IQProvider sin embargo:

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

Esto resolvió mi pequeño ejemplo anterior por salvar mi propia vCard y descargarlo de nuevo. Todavía estoy teniendo problemas con la descarga de otros usuarios vcards ... Voy a tener un vistazo más de cerca en esto y puede que abren otro hilo de esta cuestión.

Otros consejos

Puede utilizar el siguiente código para obtener información.

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

Trate de establecer una vCard para ese usuario con otro cliente en primer lugar, y ver cómo cambia sus resultados. Con el fin de diagnosticar más, tendrá que activar el protocolo de depuración en Smack (uso "-Dsmack.debugEnabled=true" en una máquina de escritorio), y después de los bits relevantes aquí.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top