Come impostare / ottenere i dati del profilo con XMPP utilizzando Smack
Domanda
Sto lavorando su un client XMPP su Android, utilizzando la libreria Smack. La roba roster / messaggistica / presenza è in esecuzione molto bene. Tuttavia, non ho trovato un modo per memorizzare informazioni aggiuntive profilo (userpicture, il nome cani, ...).
L'unico modo che vedo da googling è sull'utilizzo di vCard. Ma semplicemente non ha funzionato. Ho provato quanto segue:
VCard vCard = new VCard();
vCard.load(connection);
vCard.setEmailHome("meine_home@email.de");
vCard.setLastName("Scheller");
vCard.setField("blafasel", "asdf");
vCard.save(connection);
Poi ero alla ricerca di un modo di vedere che vCard. Lo ha fatto non compare in iChat, né in questo System.out:
vCard.load(connection, user);
System.out.println(user + " has this vCard: " + vCard.toXML());
Quindi, qualsiasi cosa è andato storto, ma c'è alcuna indicazione di cosa si trattasse. Ho provato questo con il server di Google Talk e una copia di openfire con lo stesso risultato. Btw, io sto usando questa versione di Smack: http://davanum.wordpress.com/2007/12/31/android-just-use-smack-api-for-xmpp/
Che cosa sto facendo male qui? Qual è il modo corretto di memorizzare le informazioni relative profilo con Smack?
Soluzione
Ho verificato la fonte di Smack e ha attraversato le parti più importanti con un debugger, così come con la finestra Debug Smack. Il problema è all'interno del attuazione VCard della API Smack. Salvataggio VCard funziona come descritto, tuttavia il carico è rotto.
parseIQ (XmlPullParser parser) è parte della classe PacketReader.java e gestisce diversi tipi di pacchetti. Esso gestisce solo i tag con i seguenti spazi dei nomi:
"jabber: iq: auth", "Jabber: iq: roster", "Jabber: iq: register", "Urn: ietf: params: xml: ns: XMPP-bind"
Sembra anche se c'è qualche IQProvider registrata nel ProviderManager. E questa è la radice del mio problema. Non v'è alcun IQProvider per VCard registrati. Quindi, qualunque informazione è all'interno del tag vCard semplicemente viene scartato.
Non è troppo difficile da registrare questo IQProvider però:
ProviderManager.getInstance().addIQProvider("vCard", "vcard-temp", new VCardProvider());
Ciò ha risolto il mio piccolo esempio di cui sopra per salvare la mia vCard e scaricarlo di nuovo. Sto ancora avendo problemi con il download di altri utenti vCard ... andando avere uno sguardo più attento a questo e magari aprire un altro filo per quell'edizione.
Altri suggerimenti
È possibile utilizzare il seguente codice per ottenere informazioni.
VCard card = new VCard();
card.load(connection, "user@fqdn");
System.out.println("Voice: "+card.getPhoneHome("VOICE"));
Prova a impostare una vCard per l'utente con un altro cliente in primo luogo, e vedere come che cambia i risultati. Al fine di diagnosticare ulteriormente, è necessario attivare il debug protocollo Smack (uso "-Dsmack.debugEnabled=true
" su una macchina desktop), e dopo i bit rilevanti qui.