2013-08-26 4 views
6

Я разрабатываю приложение чата с помощью сервера Openfire XMPP. Я могу общаться в чате между двумя пользователями. Но я хочу знать статус ввода, когда кто-то печатает сообщение. Поэтому я создал класс: -Как узнать статус ввода в XMPP openfire с помощью Smack

public class typingStatus implements ChatStateListener { 

    @Override 
    public void processMessage(Chat arg0, Message arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void stateChanged(Chat arg0, ChatState arg1) { 
     // TODO Auto-generated method stub 
     System.out.println(arg0.getParticipant() + " is " + arg1.name()); 

    } 

} 

Но я смущаюсь, так как это сработает? Я знаю, что мне нужен пакет, где я могу его использовать в Listener. Но я не могу найти этот пакет.

Пожалуйста, предложите, как это будет работать?

а также какая разница между Smack и asmack?

Спасибо!

+0

Просьба проверить этот вопрос в Stackoverflow: http://stackoverflow.com/questions/ 21154833/how-to-get-typing-status-notification-in-xmpp – Aneez

ответ

11

Чтобы включить ChatStateListener вам нужно создать пользовательский MessageListener класса

public class MessageListenerImpl implements MessageListener,ChatStateListener { 

    @Override 
    public void processMessage(Chat arg0, Message arg1) { 
     System.out.println("Received message: " + arg1); 

    } 

    @Override 
    public void stateChanged(Chat arg0, ChatState arg1) { 
     if (ChatState.composing.equals(arg1)) { 
      Log.d("Chat State",arg0.getParticipant() + " is typing.."); 
     } else if (ChatState.gone.equals(arg1)) { 
      Log.d("Chat State",arg0.getParticipant() + " has left the conversation."); 
     } else { 
      Log.d("Chat State",arg0.getParticipant() + ": " + arg1.name()); 
     } 

    } 

} 

Затем вы создаете MessageListener объект

MessageListener messageListener = new MessageListenerImpl(); 

А затем передать это в методе создания чата

Chat newChat = chatmanager.createChat(jabber_id_of_friend, messageListener); 

Что отличает nce между Smack и asmack? < - Check This

+0

Спасибо, сунил. хорошо выглядящий и дал мне решение. Я проверю. – user2160008

+0

userID is login-jid? – user2160008

+0

no userID - это смешок другого участника, а не тот, кто вошел в систему –

5

Наконец-то я получил решение. Мне нужно использовать чат-прослушиватель вместе с менеджером чата, а также мне нужно использовать в построенных sendcomposingnotification функция. Не нужно использовать интерфейс Messageeventrequestlistener или любой другой пользовательский класс для этого. Я добавил следующие строки ,,

connection.getChatManager().addChatListener(new ChatManagerListener() { 

      @Override 
      public void chatCreated(final Chat arg0, final boolean arg1) { 
       // TODO Auto-generated method stub 

       arg0.addMessageListener(new MessageListener() 
       { 

        @Override 
        public void processMessage(Chat arg0, Message arg1) 
        { 
         // TODO Auto-generated method stub 

         Log.d("TYpe Stat",title[0] + " is typing......"); 
         Toast.makeText(getApplicationContext(),title[0] + " is typing......",Toast.LENGTH_SHORT).show(); 
        } 



        } 
       }); 
      } 
     }); 

, а также нужно отправить уведомление, как это ..

mem.sendComposingNotification(etRecipient.getText().toString(), message.getPacketID()); 
     System.out.println("Sending notification"); 

где МЕМ тип MessageEventManger. Ссылка: http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/MessageEventManager.html

+0

привет, я попробовал выше .. но не работает! вот мой код! любая помощь будет оценена ....... Сообщение msg1 = новое сообщение (to, Message.Type.chat); msg1.setFrom ("[email protected]"); // my id MessageEventManager event = new MessageEventManager (соединение); // идентификатор получателя event.sendComposingNotification ("[email protected]", msg1.getPacketId()); – Mohit

+0

@Aneez, вам необходимо обработать сообщение, полученное в '' '' 'processMessage()' '' ', потому что оно получает все входящие пакеты, а не только' '' '' typing''''. Это может быть приостановлено, автономные/онлайн-пакеты состояния или сообщения .. поэтому попробуйте обработать его, а затем обработать .. –

+0

Привет. Я пробовал то же самое, но это не помогло мне ... ни отправить ComposingNotification, ни получить его. дает мне null при получении и пока получил его от ios. Помогите мне это узнать. Спасибо. – Kutbi

0

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

Нравится это;

try { 
     ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.composing, chat); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 

или

try { 
     ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.gone, chat); 
    } catch (XMPPException e) { 
     e.printStackTrace(); 
    } 
+0

Я использую то же самое, но он не работал. – Kutbi

+0

Возможно, ваше серверное приложение не поддерживает его. –

+0

Вы хотите сказать, что наш сервер не настроен для этого? но он отлично работает с ios для ios. Я пишу эту строку в textChangeListner из EditText. и объект чата - chatmanager = connection.getChatManager(); Чат чат = chatmanager.createChat ("user @", listner); Даже когда я получаю статус статуса от ios processMessage, я получаю null. Пожалуйста, помогите мне найти решение для отправки и получения. P.S. Я использую библиотеку asmack – Kutbi

2
ChatManager chatManager = ChatManager.getInstanceFor(connection); 
Chat chat= chatManager.createChat(to, new ChatStateListener() { 
     @Override 
     public void stateChanged(Chat chat, ChatState state) { 
       switch (state){ 
         case active: 
          Log.d("state","active"); 
          break; 
         case composing: 
          Log.d("state","composing"); 
          break; 
         case paused: 
          Log.d("state","paused"); 
          break; 
         case inactive: 
          Log.d("state","inactive"); 
          break; 
         case gone: 
          Log.d("state","gone"); 
          break; 
       } 
     } 

     @Override 
     public void processMessage(Chat chat, Message message) { 
       Log.d("processMessage","processMessage"); 
     } 
}); 

использовать этот код.надеюсь, что так будет работать

+0

Этот код не работает для меня. –

+0

Здравствуйте, Ahesanali Momin, , пожалуйста, сообщите мне точный сценарий в конце. И какая ошибка вы столкнулись в XMPP. для получения дополнительной информации мне в skype @ piyush.gupta326. то мы можем обсудить больше, ваша проблема и, надеюсь, достигнет точки успеха. –

+0

Я не получаю никакой ошибки, но когда я начинаю набирать код, он не входит ни в какое состояние, я имею в виду, что stateChangeListener не вызывается. –

1

Я использую чат состояния слушателя:

Chat chat = chatManager.createChat(jid, 
         new ChatStateChangedListener()); 

свяжи chatstatelistener с каждым JID, как выше, то:

public class ChatStateChangedListener implements ChatStateListener { 

    public ChatStateChangedListener() { 
     printLog("Chat State Changed Listner Constructor"); 
    } 

    @Override 
    public void processMessage(Chat arg0, Message arg1) { 

    } 


    @Override 
    public void stateChanged(Chat chat, ChatState state) { 

     if (state.toString().equals(ChatState.composing.toString())) { 
       tvLastSeen.setText("Typing..."); 
      } else if (state.toString().equals(ChatState.paused.toString())) { 
       tvLastSeen.setText("paused..."); 
      } else { 
       tvLastSeen.setText("nothing"); 
      } 

     } 


    } 

} 
+0

FYI: слито из http://stackoverflow.com/questions/21154833/how-to-get-typing-status-notification-in-xmpp – Shog9

1

Создать на класс MMessageListener для прослушивания входящих сообщений

частный класс MMessageListener реализует MessageListener, ChatStateListener {

public MMessageListener(Context contxt) { 
    } 


    @Override 
    public void stateChanged(Chat chat, ChatState chatState) { 

     mStatus = "Online"; 

     if (ChatState.composing.equals(chatState)) { 

      mStatus = chat.getParticipant() + " is typing.."; 
      Log.d("Chat State", chat.getParticipant() + " is typing.."); 
     } else if (ChatState.gone.equals(chatState)) { 
      Log.d("Chat State", chat.getParticipant() + " has left the conversation."); 
      mStatus = chat.getParticipant() + " has left the conversation."; 
     } else if (ChatState.paused.equals(chatState)){ 
      Log.d("Chat State", chat.getParticipant() + ": " + chatState.name()); 
      mStatus = "Paused"; 
     }else if (ChatState.active.equals(chatState)){ 
      mStatus = "Online"; 
     } 

     // do whatever you want to do once you receive status 


    } 


    @Override 
    public void processMessage(Message message) { 

    } 

    @Override 
    public void processMessage(Chat chat, Message message) { 


    } 
} 

Добавить Слушатель к объекту чата

чат MyChat = ChatManager.getInstanceFor (соединение) .createChat ( "user2 @ локальный адрес"), mMessageListener);

Отправить статус для получения пользователя на EditText изменения текста

ChatStateManager.getInstance (соединение) .setCurrentState (ChatState.composing, MyChat);

Это прекрасно работает для меня.

+0

Привет, Dharmesh, я сделал то же самое, но я получаю null всегда при составлении сообщения состояния in processMessage. My EditText метод изменения текста: newChat = chatmanager.createChat (send_to, messageListener); Сообщение msg = новое Сообщение (send_to, Message.Type.chat); msg.setFrom (USERNAME_LOGIN + "@" + HOST_NAME); // мой id newChat.sendMessage (msg); ChatStateManager.getInstance (соединение) .setCurrentState (ChatState.composing, newChat); И это также не передает статус другим. – Kutbi

+0

FYI: слито из http://stackoverflow.com/questions/21154833/how-to-get-typing-status-notification-in-xmpp – Shog9

+0

Как проверить, приостановлен ли пользователь или больше не печатается в editext? –

0

Однако вы также можете получить его из ProcessPacket. там вы получите объект Message, после того как вы сможете извлечь часть xml оттуда и обработать их, в нем будет указано определенное chatstate или нет.

Message message = (Message) packet; 
    String msg_xml = message.toXML().toString(); 

    if (msg_xml.contains(ChatState.composing.toString())) { 
     //handle is-typing, probably some indication on screen 
    } else if (msg_xml.contains(ChatState.paused.toString())) { 
     // handle "stopped typing" 
    } else { 
     // normal msg 
    } 

сейчас ручка согласно вашему требованию.

0

Просто добавьте ChatStateManager после ChatManager intalization:

chatManager = ChatManager.getInstanceFor(getXmpptcpConnection()); 
ChatStateManager.getInstance(getXmpptcpConnection()); 

Затем вам нужно добавить ChatStateListener во createChat(to,chatMesageListener):

chatManager.createChat(message.getTo(), chatMessageListener).sendMessage(message); 

private ChatStateListener chatMessageListener = new ChatStateListener() { 

    @Override 
    public void stateChanged(Chat chat, ChatState state) { 
     //State Change composing,active,paused,gone,etc 
     Log.d(TAG, "ChatStateListener:::stateChanged -> " + chat.toString() + " \n -> " + state.toString()); 
    } 

    @Override 
    public void processMessage(Chat chat, Message message) { 
     //Incoming Message 
     Log.d(TAG, "ChatStateListener:::processMessage -> " + chat.toString() + " \n -> " + message.toString()); 
    } 
}; 
+0

FYI: слито из http://stackoverflow.com/questions/22225394/how-to-get-the-typing-status-in-asmack-android – Shog9

+0

В следующий раз, возможно, просто ответьте на один вопрос и отметьте остальное, чтобы мы могли знайте, что они дубликаты; отправка одного и того же ответа 7 раз довольно чрезмерная. – Shog9

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