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

时间:2012-04-24 10:21:00

标签: android xmpp android-2.2-froyo smack asmack

您好每个人我是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
    }

2 个答案:

答案 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中我们必须自己注册它们。