2011-05-06 17 views
6

tengo este código, casi sin modificar a partir de ejemplos:getSearchForm devuelve un valor nulo cuando se utiliza UserSearch en XMPP con aSmack

   UserSearchManager usm = new UserSearchManager(conn); 
       Form searchForm = usm.getSearchForm("search.myserver.com"); 
       Form answerForm = searchForm.createAnswerForm(); 
       answerForm.setAnswer("Username", true); 
       answerForm.setAnswer("search", contact.getJid()); 
       ReportedData data = usm.getSearchResults(answerForm, "search.myserver.com"); 

Esto funciona perfectamente en un entorno de escritorio, usando la biblioteca Smack, pero no puedo conseguir que se trabajo en Android (donde tengo que usar Asmack).

El problema es que searchForm es nulo porque getSearchForm devuelve null. Esto parece ser bastante extraño ya que no puedo encontrar ninguna documentación sobre qué casos ese método debería devolver nulo.

El servidor es Openfire, si sirve de ayuda.

Respuesta

16

actualización 04/2014

La respuesta original a continuación contiene ahora la información antigua y obsoleta. Desde aSmack 0.8 ya no es necesario configurar manualmente el administrador de proveedores. Llamando al SmackAndroid.init(Context) como aSmack README le dice que haga, se encarga de todas las inicializaciones necesarias.

respuesta original

Al final, el problema era global para toda asmack. Parece que es un problema conocido: el archivo smack.providers, normalmente en la carpeta/META-INF en versiones normales de smack, no se puede cargar en Android porque está empaquetado en el contenedor. Entonces todos los proveedores deben ser inicializados a mano, como se muestra en la respuesta de Mike Ryan en este hilo: http://community.igniterealtime.org/message/201866#201866

Quité las cosas que no funcionaron para mí, y este es el resultado.

public void configure(ProviderManager pm) { 

// Private Data Storage 
pm.addIQProvider("query","jabber:iq:private", new PrivateDataManager.PrivateDataIQProvider()); 

// Time 
try { 
    pm.addIQProvider("query","jabber:iq:time", Class.forName("org.jivesoftware.smackx.packet.Time")); 
} catch (ClassNotFoundException e) { 
    Log.w("TestClient", "Can't load class for org.jivesoftware.smackx.packet.Time"); 
} 

// Roster Exchange 
pm.addExtensionProvider("x","jabber:x:roster", new RosterExchangeProvider()); 

// Message Events 
pm.addExtensionProvider("x","jabber:x:event", new MessageEventProvider()); 

// Chat State 
pm.addExtensionProvider("active","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
pm.addExtensionProvider("composing","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
pm.addExtensionProvider("paused","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
pm.addExtensionProvider("inactive","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 
pm.addExtensionProvider("gone","http://jabber.org/protocol/chatstates", new ChatStateExtension.Provider()); 

// XHTML 
pm.addExtensionProvider("html","http://jabber.org/protocol/xhtml-im", new XHTMLExtensionProvider()); 

// Group Chat Invitations 
pm.addExtensionProvider("x","jabber:x:conference", new GroupChatInvitation.Provider()); 

// Service Discovery # Items  
pm.addIQProvider("query","http://jabber.org/protocol/disco#items", new DiscoverItemsProvider()); 

// Service Discovery # Info 
pm.addIQProvider("query","http://jabber.org/protocol/disco#info", new DiscoverInfoProvider()); 

// Data Forms 
pm.addExtensionProvider("x","jabber:x:data", new DataFormProvider()); 

// MUC User 
pm.addExtensionProvider("x","http://jabber.org/protocol/muc#user", new MUCUserProvider()); 

// MUC Admin  
pm.addIQProvider("query","http://jabber.org/protocol/muc#admin", new MUCAdminProvider()); 

// MUC Owner  
pm.addIQProvider("query","http://jabber.org/protocol/muc#owner", new MUCOwnerProvider()); 

// Delayed Delivery 
pm.addExtensionProvider("x","jabber:x:delay", new DelayInformationProvider()); 

// Version 
try { 
    pm.addIQProvider("query","jabber:iq:version", Class.forName("org.jivesoftware.smackx.packet.Version")); 
} catch (ClassNotFoundException e) { 
    // Not sure what's happening here. 
} 

// VCard 
pm.addIQProvider("vCard","vcard-temp", new VCardProvider()); 

// Offline Message Requests 
pm.addIQProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageRequest.Provider()); 

// Offline Message Indicator 
pm.addExtensionProvider("offline","http://jabber.org/protocol/offline", new OfflineMessageInfo.Provider()); 

// Last Activity 
pm.addIQProvider("query","jabber:iq:last", new LastActivity.Provider()); 

// User Search 
pm.addIQProvider("query","jabber:iq:search", new UserSearch.Provider()); 

// SharedGroupsInfo 
pm.addIQProvider("sharedgroup","http://www.jivesoftware.org/protocol/sharedgroup", new SharedGroupsInfo.Provider()); 

// JEP-33: Extended Stanza Addressing 
pm.addExtensionProvider("addresses","http://jabber.org/protocol/address", new MultipleAddressesProvider()); 

// FileTransfer 
pm.addIQProvider("si","http://jabber.org/protocol/si", new StreamInitiationProvider()); 

pm.addIQProvider("query","http://jabber.org/protocol/bytestreams", new BytestreamsProvider()); 

// Privacy 
pm.addIQProvider("query","jabber:iq:privacy", new PrivacyProvider()); 
pm.addIQProvider("command", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider()); 
pm.addExtensionProvider("malformed-action", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.MalformedActionError()); 
pm.addExtensionProvider("bad-locale", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadLocaleError()); 
pm.addExtensionProvider("bad-payload", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadPayloadError()); 
pm.addExtensionProvider("bad-sessionid", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.BadSessionIDError()); 
pm.addExtensionProvider("session-expired", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.SessionExpiredError()); 

}

sólo comentó un par de líneas, y listo. Esto se debe llamar antes de crear instancias de XMPPConnection, con una línea como la siguiente:

configure(ProviderManager.getInstance()); 

Ahora voy a tener que lidiar con mis otros problemas, pero al menos éste se resuelve :)

Cuestiones relacionadas