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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top