您好每个人我是Android的新手,我目前仍然坚持这一点。 我必须返回在xmpp服务器上创建的公共房间列表。我遇到的问题是下面的代码适用于java,但在android的情况下有一个空指针异常。 对此有任何帮助将不胜感激。
我正在使用openfire服务器并在本地计算机上进行测试,这就是我使用ip地址而不是域名的原因。
我正在使用smack库为JAVA和Asmack Library for android
String server_name = "192.168.3.113";
ConnectionConfiguration config = new ConnectionConfiguration(
server_name, 5222);
XMPPConnection connection = new XMPPConnection(config);
try {
connection.connect();
connection.login("s1", "123");
Collection<HostedRoom> rooms = MultiUserChat.getHostedRooms(
connection, "conference.geekoid");
for (HostedRoom room : rooms) {
System.out.println(room.getName());
}
} catch (XMPPException e) {
System.out.println("Error" + e.getMessage() + "\n"); //for JAVA
log.e("Android Error",e.getmessage()); // For Android
}
答案 0 :(得分:6)
问题是必须在创建任何连接之前评估static block of the ServiceDiscoveryManager class。在smack中,这是通过配置文件完成的,但这种方法不适用于Android,因此也不适用于aSmack。
答案中提到的解决方法有点难看,因为你真的不想使用构造函数来获取SDM对象,而应该使用get()方法。但get()方法仅在实际为连接创建SDM时才有效。
因此,为了在Android上正确初始化SDM,您需要在创建第一个(XMPP)Connection对象之前调用full forName notation来初始化类的静态块。
Class.forName("org.jivesoftware.smackx.ServiceDiscoveryManager", true, ClassLoader.getSystemClassLoader()):
此跟踪为aSmack Issue 8
答案 1 :(得分:6)
我找到了解决问题的方法。
Android asmack库正在使用它 getHostedRooms(连接连接, String serviceName)方法
ServiceDiscoveryManager discoManager =ServiceDiscoveryManager.getInstanceFor(connection);
我用
替换了它ServiceDiscoveryManager discoManager = new ServiceDiscoveryManager(connection);
对于那些对此方法感到困惑的人
包:org.jivesoftware.smackx.muc
文件:MultiUserChat.java
完成此操作后。我们必须注册Android中的所有提供商,其详细信息可以找到here。当使用JAVA的smack库(在Java开发中)时,这些提供程序会自动注册,但在Android中我们必须自己注册它们。