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

She*_*lji 4 android xmpp smack android-2.2-froyo 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
    }
Run Code Online (Sandbox Code Playgroud)

Flo*_*low 6

问题是必须在创建任何连接之前评估ServiceDiscoveryManager类静态块.在smack中,这是通过配置文件完成的,但这种方法不适用于Android,因此也不适用于aSmack.

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

因此,为了在Android上正确初始化SDM,您需要在创建第一个(XMPP)Connection对象之前调用完整的forName表示法来初始化类的静态块.

Class.forName("org.jivesoftware.smackx.ServiceDiscoveryManager", true, ClassLoader.getSystemClassLoader()):
Run Code Online (Sandbox Code Playgroud)

这被跟踪为一个问题8


She*_*lji 6

我找到了问题的解决方案.

Android asmack库在 getHostedRooms(连接连接,String serviceName)方法中使用它

ServiceDiscoveryManager discoManager =ServiceDiscoveryManager.getInstanceFor(connection);
Run Code Online (Sandbox Code Playgroud)

我换了

ServiceDiscoveryManager discoManager = new ServiceDiscoveryManager(connection);
Run Code Online (Sandbox Code Playgroud)

对于那些混淆这种方法的人来说

包:org.jivesoftware.smackx.muc

文件:MultiUserChat.java

完成后你做完了.我们必须注册Android中的所有提供商,其详细信息可在此处找到.当使用JAVA的smack库(在Java开发中)时,这些提供程序会自动注册,但在Android中,我们必须自己注册它们.