在XMPP使用UserSearch与aSmack时getSearchForm返回nullUserSearch、XMPP、aSmack、null

2023-09-12 06:31:15 作者:小心!路边水坑里有鲨鱼

我有这个code,从例子中,几乎未经修改的:

I have this code, almost unmodified from examples:

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

这完全在桌面环境下,使用的Smack库,但我不能让它在Android中工作(这里我不得不使用asmack)。

This works perfectly in a Desktop environment, using Smack library, but I can't get it to work in Android (where I have to use asmack).

现在的问题是searchForm为空,因为getSearchForm返回null。这似乎是pretty的奇怪,因为我似乎无法找到任何文件在什么情况下该方法应该返回null。

The problem is searchForm is null because getSearchForm returns null. This seems to be pretty odd as I can't seem to find any documentation on which cases that method should return null.

该服务器的Openfire,如果有帮助。

The server is Openfire, if it helps.

推荐答案

更新04/2014

下原来的答复包含现在旧的和过时的信息。由于aSmack 0.8就不再需要手动配置提供者管理。呼叫 SmackAndroid.init(上下文)作为aSmack README告诉你做什么,采取一切必要的初始化照顾。

The original answer below contains now old and outdated information. Since aSmack 0.8 it's no longer necessary to manually configure the provider manager. Calling SmackAndroid.init(Context) as the aSmack README tells you to do, takes care of all necessary initializations.

原来的答案

在最后,问题是全局所有asmack。这似乎是一个已知的问题:smack.providers文件,通常在咂嘴正常版本/ META-INF文件夹,无法在Android的加载,因为它的jar包。因此,所有的供应商必须通过手工进行初始化,如在此线程迈克·瑞恩的回答是: HTTP:/ /community.igniterealtime.org/message/201866#201866

In the end, the problem was global to all asmack. It seems it's a known issue: the smack.providers file, usually in /META-INF folder in normal versions of smack, can't be loaded in Android because its jar packaging. So all the providers must be initialized by hand, as shown in Mike Ryan's answer in this thread: http://community.igniterealtime.org/message/201866#201866

我删除了没有工作对我的东西,这就是结果。

I removed the stuff that didn't worked for me, and this is the result.

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之前,有这样一行:

I only commented a couple lines, and voilà. This should be called before instantiating XMPPConnection, with a line like this:

    configure(ProviderManager.getInstance());

现在我不得不面对我的其他问题,但至少这一次解决:)

Now I'll have to deal with my other problems, but at least this one is solved :)