gpt4 book ai didi

android - 无法从 Android 上的 xmpp 服务器获取公共(public)房间列表?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:09 24 4
gpt4 key购买 nike

大家好,我是 android 的新手,我目前被困在这个问题上。我必须返回在 xmpp 服务器上创建的公共(public)房间列表。我遇到的问题是下面的代码适用于 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
}

最佳答案

问题是 static block of the ServiceDiscoveryManager class必须在创建任何 连接之前进行评估。在 smack 中,这是通过配置文件完成的,但这种方法不适用于 Android,因此不适用于 aSmack。

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

因此,为了在 Android 上正确初始化 SDM,您需要调用 full forName notation在创建第一个 (XMPP)Connection 对象之前初始化类的静态 block 。

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

这被跟踪为 aSmack Issue 8

关于android - 无法从 Android 上的 xmpp 服务器获取公共(public)房间列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10296022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com