无法从Android上的xmpp服务器获取公共房间列表?

无法从Android上的xmpp服务器获取公共房间列表?,android,xmpp,android-2.2-froyo,smack,asmack,Android,Xmpp,Android 2.2 Froyo,Smack,Asmack,大家好,我是android的新手,目前我一直在做这个。 我必须返回在xmpp服务器上创建的公共房间列表。我遇到的问题是,下面的代码在java中运行良好,但在android中存在空指针异常。 任何有关这方面的帮助都将不胜感激 我正在使用openfire服务器,并在本地计算机上进行测试,这就是我使用ip地址而不是域名的原因 我正在使用用于JAVA的smack库和用于android的Asmack库 String server_name = "192.168.3.113"; Connection

大家好,我是android的新手,目前我一直在做这个。 我必须返回在xmpp服务器上创建的公共房间列表。我遇到的问题是,下面的代码在java中运行良好,但在android中存在空指针异常。 任何有关这方面的帮助都将不胜感激

我正在使用openfire服务器,并在本地计算机上进行测试,这就是我使用ip地址而不是域名的原因

我正在使用用于JAVA的smack库和用于android的Asmack库

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
    }
String server_name=“192.168.3.113”;
ConnectionConfiguration配置=新连接配置(
服务器名称(5222);
XMPPConnection连接=新的XMPPConnection(配置);
试一试{
connection.connect();
连接。登录(“s1”、“123”);
收集室=MultiUserChat.getHostedRooms(
连接,“conference.geekoid”);
住宿(客房:客房){
System.out.println(room.getName());
}
}捕获(XMPPException e){
System.out.println(“错误”+e.getMessage()+“\n”);//对于JAVA
log.e(“Android错误”,e.getmessage());//用于Android
}
问题在于,在创建任何连接之前,必须对进行评估。在smack中,这是通过配置文件完成的,但这种方法在Android上不起作用,因此在aSmack上也不起作用

答案中提到的解决方法有点难看,因为您确实不想使用构造函数来获取SDM对象,而应该使用get()方法。但是get()方法只有在实际为连接创建了SDM时才有效

因此,为了在Android上正确初始化SDM,您需要在创建第一个(XMPP)连接对象之前调用初始化类的静态块

Class.forName("org.jivesoftware.smackx.ServiceDiscoveryManager", true, ClassLoader.getSystemClassLoader()):

这被跟踪为

我已找到问题的解决方案。

Android asmack库在中使用了此功能 getHostedRooms(连接, 字符串(serviceName)方法

ServiceDiscoveryManager discoManager =ServiceDiscoveryManager.getInstanceFor(connection);
我把它换成了

ServiceDiscoveryManager discoManager = new ServiceDiscoveryManager(connection);
对于那些不知道这种方法在哪里的人

包:org.jivesoftware.smackx.muc

文件:MultiUserChat.java


在你做完这件事之后。我们必须注册安卓系统中的所有提供商,其详细信息可以找到。这些提供者在使用JAVA的smack库(在JAVA开发中)时会自动注册,但在Android中,我们必须自己注册它们。

NPE的stacktrace会很有帮助。如果您没有显示使用实际错误,我们将无能为力。此外,请确保使用最新版本的aSmack。再见,非常感谢你的帮助。这是图书馆的问题。因此,我已经解决了它如果你已经解决了你的问题,请添加解决方案作为回答:非常感谢你的回答answer@SherazKhilji如果你觉得答案有帮助,请随意投票