2011-05-06 39 views
6

我有這樣的代碼,幾乎未修改從實例時返回null:getSearchForm在XMPP使用UserSearch與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"); 

這工作完全在桌面環境下,用拍擊庫,但我不能得到它在Android工作(我必須使用asmack)。

問題是searchForm爲null,因爲getSearchForm返回null。這似乎很奇怪,因爲我似乎無法找到任何文檔關於該方法應該返回null的情況。

服務器是Openfire,如果有幫助的話。

回答

16

更新04/2014

下原來的答案現在包含舊的和過時的信息。自aSmack 0.8以來,不再需要手動配置提供者管理器。以aSmack自述文件告知您要求SmackAndroid.init(Context)進行調用,並負責所有必要的初始化。

原來的答案

最後,問題是全局所有asmack。看起來這是一個已知問題:smack.providers文件(通常位於常規版本的smack中的/ META-INF文件夾中)無法在Android中加載,因爲它的jar包。因此,所有提供者都必須手動初始化,如Mike Ryan在此主題中的答案所示:http://community.igniterealtime.org/message/201866#201866

我刪除了那些對我無效的東西,這就是結果。

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

}

我只評論幾行,就萬事大吉了。這應該實例XMPPConnection,用這樣的行之前被稱爲:

configure(ProviderManager.getInstance()); 

現在我不得不面對我的其他問題,但至少這一次就解決了:)

相關問題