2015-11-26 3 views
1

Я успешно создал пользователя, используя следующий код:Как добавить пользователей в список в xmpp?

accountmanager = new org.jivesoftware.smack.AccountManager(connection); 
accountmanager.createAccount(fbuserid,fbuserid); 

Но я не могу добавить других пользователей, вошедшего в список пользователя, используя следующий код:

public void createEntry(String user, String name, String[] groups) throws XMPPException { 
    // Create and send roster entry creation packet. 
    RosterPacket rosterPacket = new RosterPacket(); 
    rosterPacket.setType(IQ.Type.SET); 
    RosterPacket.Item item = new RosterPacket.Item(user, name); 
    if (groups != null) { 
     for (String group : groups) { 
      if (group != null) { 
       item.addGroupName(group); 
      } 
     } 
    } 
    rosterPacket.addRosterItem(item); 
    // Wait up to a certain number of seconds for a reply from the server. 
    PacketCollector collector = connection.createPacketCollector(
      new PacketIDFilter(rosterPacket.getPacketID())); 
    connection.sendPacket(rosterPacket); 
    IQ response = (IQ) collector.nextResult(SmackConfiguration.getPacketReplyTimeout()); 
    collector.cancel(); 
    if (response == null) { 
     throw new XMPPException("No response from the server."); 
    } 
    // If the server replied with an error, throw an exception. 
    else if (response.getType() == IQ.Type.ERROR) { 
     throw new XMPPException(response.getError()); 
    } 

    // Create a presence subscription packet and send. 
    Presence presencePacket = new Presence(Presence.Type.subscribe); 
    presencePacket.setTo(user); 
    connection.sendPacket(presencePacket); 
} 

я всегда получив ответ как null. Кто-то, пожалуйста, помогите мне решить эту проблему и заблаговременно заблаговременно

+0

Является ли это ваш код, или это тело Класс Smack 'Roster'? Вы получаете 'XMPPError' или' XMPPException' - так просто «нет ответа от сервера»? – Antoniossss

+0

Его тело класса Смака, и я получаю исключение XMPP. – Phoenix

+0

Испытаны ли у вашего собственного сервера? - Проверьте журналы. Если сторонняя сторона, пожалуйста, свяжитесь с sysadmin, либо есть какая-то ошибка на стороне сервера (но не снята с охраны), создание списка запрещено или реализация сервера не соответствует требованиям XEP. – Antoniossss

ответ

3

Реестры и наличие используют модель на основе разрешений, где пользователи должны давать разрешение до того, как они будут добавлены в чужой список. Это защищает конфиденциальность пользователя, убедившись, что только одобренные пользователи могут просматривать информацию о своем присутствии. Поэтому, когда вы добавляете новую запись реестра, она будет находиться в состоянии ожидания, пока другой пользователь не примет ваш запрос.

Если другой пользователь запрашивает подписку на присутствие, чтобы добавить вас в свой список, вы должны принять или отклонить этот запрос. Smack обрабатывает запросы на подписку на присутствие одним из трех способов:

Автоматически принимать все запросы на подписку на присутствие. Автоматически отклонять все запросы на подписку на присутствие. Запросы на подписку на процесс присутствия вручную. Режим можно установить с помощью метода Roster.setSubscriptionMode (Roster.SubscriptionMode). Простые клиенты обычно используют один из режимов автоматической подписки, а полнофункциональные клиенты должны вручную обрабатывать подписные запросы и позволить конечным пользователям принимать или отклонять каждый запрос. Если вы используете ручной режим, необходимо зарегистрировать PacketListener, который будет прослушивать пакеты присутствия, имеющие тип Presence.Type.subscribe.

Попробуйте в коде сначала добавить пользователя в список, а также запросить разрешение пользователя.

roster = Roster.getInstanceFor(connection); 
      if (!roster.isLoaded()) 
       try { 
        roster.reloadAndWait(); 
       } catch (SmackException.NotLoggedInException e) { 
        Log.i(TAG, "NotLoggedInException"); 
        e.printStackTrace(); 
       } catch (SmackException.NotConnectedException e) { 
        Log.i(TAG, "NotConnectedException"); 
        e.printStackTrace(); 
       } 
    roster.createEntry(jID, name, null); 

На другой стороне пользователя/в коде после входа в систему от одного пользователя:

roster.setSubscriptionMode(Roster.SubscriptionMode.accept_all); 

Чтобы сделать статус пользователя на сайте:

Presence presence = new Presence(Presence.Type.available); 
      presence.setStatus("Online, Programmatically!"); 
      presence.setPriority(24); 
      presence.setMode(Presence.Mode.available); 
      roster = Roster.getInstanceFor(connection); 
+0

Я получаю исключение для исключения нулевой указатель при вызове createEntry() – Phoenix

+0

Возможно, что список неправильно инициализирован. В моем случае я инициализирован, как и выше, проверьте отредактированный ответ. – sanjay