当在 XMPP 中使用 UserSearch 和 aSmack 时,getSearchForm 返回 null
我有这段代码,几乎没有对示例进行修改:
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)。
问题是 searchForm 为 null,因为 getSearchForm 返回 null。这似乎很奇怪,因为我似乎找不到任何关于该方法应返回 null 的情况的文档。
服务器是Openfire,如果有帮助的话。
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");
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).
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.
The server is Openfire, if it helps.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
更新 04/2014
下面的原始答案包含现在旧的和过时的信息。从 aSmack 0.8 开始,不再需要手动配置提供程序管理器。按照 aSmack 自述文件的指示调用
SmackAndroid.init(Context)
来处理所有必要的初始化。原始答案
最后,这个问题对所有人来说都是全球性的。这似乎是一个已知问题:smack.providers 文件(通常位于普通版本 smack 中的 /META-INF 文件夹中)由于其 jar 打包而无法在 Android 中加载。因此,所有提供程序都必须手动初始化,如 Mike Ryan 在该线程中的回答所示:http://community.igniterealtime。 org/message/201866#201866
我删除了对我不起作用的东西,这就是结果。
。
我只评论了几行,瞧 这应该在实例化 XMPPConnection 之前调用,并使用如下一行:
现在我必须处理其他问题,但至少这个问题已经解决了:)
Update 04/2014
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.Original Answer
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.
}
I only commented a couple lines, and voilà. This should be called before instantiating XMPPConnection, with a line like this:
Now I'll have to deal with my other problems, but at least this one is solved :)
在代码示例 XmppTool.java 中,
getSearchFrom
用于searchUsers()
中。您可以参考java文件中的全局设置来修复您的代码。
In the code example XmppTool.java,
getSearchFrom
is used insearchUsers()
.You may refer to the global settings in the java file to repair your code.
UserSearchManager的Javadoc解释如下:
The Javadoc of UserSearchManager explains as follows: