2016-07-21 3 views
0

Я пытаюсь создать приложение чата. - Я установил сервер openfire на свой локальный компьютер - И добавил некоторых пользователей через панель администратора openfire - Теперь я пытаюсь отобразить всех доступных пользователей в Android-эмуляторе. - Я могу подключиться к openfire server usign aSmack lib. Но ошибка при подключении .getRoster() ;.Как получить openfire онлайн зарегистрированных пользователей из Android-клиента с помощью Smack?

 ConnectionConfiguration config = new ConnectionConfiguration("10.42.0.3", 5222, "localhost"); 
     connection = new XMPPConnection(config); 

     try { 
      connection.connect(); 
      Log.d("SMACK ", " CONNECTED"); 


     // list online contacts 
      Roster roster = connection.getRoster(); 
      Collection<RosterEntry> entries = roster.getEntries(); 
      Log.d("TRACE", "entries.size()=" + entries.size()); 
      for (RosterEntry e : entries) { 
       Log.d("PRESENCE", e.getUser() + "=" + roster.getPresence(e.getUser()).isAvailable()); 
       if (roster.getPresence(e.getUser()).isAvailable()) { 
        Log.d("ADD", "NAME_KEY=" + e.getName() + " USERJID_KEY=" + e.getUser()); 
        //contacts.add(contact); 
       } 
      } 
     } 
     catch (XMPPException e){ 
      Log.e("XMPPChatDemoActivity", "Failed to connect to "+ connection.getHost()); 
      Log.e("XMPPChatDemoActivity", e.toString()); 
     } 

Этот код дает мне ошибку на этой линии connection.getRoster(); не найден.

здесь я мои зависимости

compile fileTree(dir: 'libs', include: ['*.jar']) 
compile 'com.android.support:appcompat-v7:22.2.1' 
compile 'com.android.support:design:22.2.1' 
compile 'com.google.android.gms:play-services:8.3.0' 

compile "org.igniterealtime.smack:smack-java7:4.1.0" 
// Optional for XMPPTCPConnection 
compile "org.igniterealtime.smack:smack-tcp:4.1.0" 
// Optional for XMPP-IM (RFC 6121) support (Roster, Threaded Chats, …) 
compile "org.igniterealtime.smack:smack-im:4.1.0" 
// Optional for XMPP extensions support 
compile "org.igniterealtime.smack:smack-extensions:4.1.0" 
+0

Если вы хотите «АЛЛА доступных пользователей» в сервере, вам нужно установить в Openfire JABBER SEARCH (плагин search.jar), часто это пакет, а затем осуществить исследование. Реестр это что-то другое. – MrPk

ответ

1

Смак не имеет такой возможности. Но вы можете получить список пользователей, используя REST API. Для этого установите плагин api для отдыха на стороне сервера из репозитория плагинов. Затем в стороне клиента добавить rest api client,

Maven:

<dependency> 
    <groupId>org.igniterealtime</groupId> 
    <artifactId>rest-api-client</artifactId> 
    <version>1.1.3</version> 
</dependency> 

Gradle:

compile 'org.igniterealtime:rest-api-client:1.1.3' 

Пример:

AuthenticationToken token = new AuthenticationToken("rest_api_token"); 
RestApiClient client = new RestApiClient("host", port, token); 
UserEntities entities = client.getUsers(); // UserEntities have all users list including admin. 

** Вы получите отдых токен в REST API сервера раздел.

0

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

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

Вкратце вы должны получить к нему доступ через http/rest apis. Вы можете включить rest api на консоли администратора openfire, и вы можете использовать этот клиент для api для стороннего разработчика. - https://github.com/xibsked/Openfire-Rest-Api-Client-Android

Существует приложение уже использует этот API, который, как Openfire Администратор Console- https://play.google.com/store/apps/details?id=com.sked.ofadmin

Реализации довольно легко -

OfApiClient.with(this).account(account).getUser("admin", 
      new Listener<User>() { 
       @Override 
       public void onResponse(Object mTag, User user) { 
        //Handle Success 
       } 
      }, 
      new ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        //Handle Failure 
       } 
      }); 

 Смежные вопросы

  • Нет связанных вопросов^_^