getSearchForm restituisce null quando si utilizza UserSearch in XMPP con aSmack

Ho questo codice, quasi non modificato da esempi:

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"); 

Questo funziona perfettamente in un ambiente Desktop utilizzando la libreria Smack, ma non posso farlo funzionare in Android (where devo usare asmack).

  • Come creare lo background della forma del parallelogramma?
  • java.lang.IllegalArgumentException: nessuna vista trovata per id 0x1020002 (android: id / content) per frammento
  • versione chiave errata quando si fa chiamata https
  • compreso il sencha touch 2 in eclipse
  • C'è una libreria o un algorithm per il calendario persiano (Shamsi o Jalali) in Android?
  • Interrompere il text di grandi size in pagine in switcher di text android o visualizzare il flipper
  • Il problema è searchForm è nullo perché getSearchForm restituisce null. Questo sembra essere abbastanza strano come non riesco a trovare alcuna documentazione sui casi in cui tale metodo dovrebbe restituire nulla.

    Il server è Openfire, se aiuta.

  • Eccezione di puntatore nullo su .setOnClickListener
  • Quanto dovrebbero essere le icone di azione (barra degli strumenti) della barra degli strumenti nel nuovo disegno di materiale Android?
  • Android: crea un button di scorrimento con l'image e nessun text
  • Come importre automaticamente le classi necessarie in Android Studio con un collegamento rapido?
  • L'intenzione dalla notifica non ha extra
  • BroadcastReceiver non funziona quando l'applicazione non è in esecuzione
  • One Solution collect form web for “getSearchForm restituisce null quando si utilizza UserSearch in XMPP con aSmack”

    Aggiornamento 04/2014

    La risposta originale di seguito contiene ora informazioni obsolete e obsolete. Dal momento che aSmack 0.8 non è più necessario configurare manualmente il gestore del provider. Chiamando SmackAndroid.init(Context) come il README di aSmack ti dice di fare, si prende cura di tutte le inizializzazioni necessarie.

    Risposta originale

    Alla fine, il problema era globale a tutti i tipi di asmack. Sembra che sia un problema noto: il file smack.providers, di solito nella cartella / META-INF nelle versioni normali di smack, non può essere caricato in Android perché il suo packaging di jar. Quindi tutti i provider devono essere inizializzati a mano, come risulta dalla risposta di Mike Ryan in questo thread: http://community.igniterealtime.org/message/201866#201866

    Ho rimosso la roba che non ha funzionato per me e questo è il risultato.

     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("malformsd-action", "http://jabber.org/protocol/commands", new AdHocCommandDataProvider.MalformsdActionError()); 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()); 

    }

    Ho commentato solo un paio di linee, e voilà. Questo deve essere chiamato prima di eseguire l'istallazione di XMPPConnection, con una row come questa:

      configure(ProviderManager.getInstance()); 

    Ora dovrò occuparmi dei miei altri problemi, ma alless questo è risolto 🙂

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.