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)
问题是必须在创建任何连接之前评估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
我找到了问题的解决方案.
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中,我们必须自己注册它们.
| 归档时间: |
|
| 查看次数: |
3017 次 |
| 最近记录: |