2012-04-24 3 views
4

Привет всем Я новичок в android, и я в настоящее время застрял на этом. Мне нужно вернуть список общественных комнат, созданных на сервере xmpp. Проблема, с которой я сталкиваюсь, заключается в том, что приведенный ниже код отлично работает для java, но в случае андроида есть исключение нулевого указателя. Любая помощь в этом отношении будет оценена по достоинству.Не удается получить список общедоступных комнат с сервера xmpp на Android?

Я использую сервер openfire и тестирую его на локальном компьютере, поэтому я использую ip-адрес вместо имени домена.

Я использую привкус библиотеку для JAVA и 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 
    } 
+0

Было бы полезно использовать стопку NPE. Мы не можем помочь, если вы не используете фактическую ошибку. Кроме того, обязательно используйте последнюю версию aSmack. См. [Этот вопрос] (http://stackoverflow.com/questions/4769020/android-and-xmpp-currently-available-solutions/5487854#5487854) – Flow

+0

Благодарю вас за помощь. это была проблема с библиотекой. Так что я уже решил это –

+1

Если вы решили свой вопрос, добавьте решение в качестве ответа: http: //meta.stackexchange.com/questions/17845/ethiquette-for-answering-your-own-question – MattJ

ответ

6

Я нашел решение этой проблемы.

Библиотека Android asmack использует это в getHostedRooms (подключение Подключение, Строка SERVICENAME) метод

ServiceDiscoveryManager discoManager =ServiceDiscoveryManager.getInstanceFor(connection); 

я заменил его

ServiceDiscoveryManager discoManager = new ServiceDiscoveryManager(connection); 

Для тех, кто запутался, где этот метод является его значением в

Пакет: org.jivesoftware.smackx.muc

Файл: MultiUserChat.java

После того, как вы сделали это. Мы должны зарегистрировать всех поставщиков в Android, чья подробная информация находится в here. Эти поставщики автоматически регистрируются при использовании библиотеки smack JAVA (In java Development), но в Android мы должны регистрировать их самостоятельно.

6

Проблемы в том, что static block of the ServiceDiscoveryManager class должна быть оценена до создания любого соединения. В smack это делается через файл конфигурации, но этот подход не работает на Android и, следовательно, на aSmack.

Обходной путь, упомянутый в ответе, как-то уродлив, так как вы действительно не хотите использовать конструктор для извлечения объекта SDM, вместо этого следует использовать метод get(). Но метод get() работает только в том случае, если для соединения был создан SDM.

Итак, чтобы правильно инициализировать SDM на Android, вы должны вызвать full forName notation, чтобы инициализировать статические блоки класса, прежде чем создавать первый объект соединения (XMPP).

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

Это отслеживаются как aSmack Issue 8

+0

THanku очень много для ответа –

+0

@SherazKhilji не стесняйтесь отвечать на ответ, если найдете его полезным – Flow