Как узнать состояние ввода в XMPP openfire с помощью Smack

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

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?

Спасибо!

Solutions Collecting From Web of "Как узнать состояние ввода в XMPP openfire с помощью Smack"

Чтобы включить 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); 

Какая разница между Smack и asmack? <- Проверить это

Наконец, я получил решение. Мне нужно использовать чат-прослушиватель вместе с менеджером чата, а также мне нужно использовать встроенную функцию 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"); 

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

 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"); } }); 

Используйте этот код. Надеюсь, так будет работать

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

 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"); } } } } 

Ваш или другой клиент 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(); } 

Создать On Class для 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 @ localhost"), mMessageListener);

Отправить статус получателю на изменение текста edittext

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

Это отлично работает для меня.

Однако вы также можете получить его из 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 } 

Теперь обрабатывайте согласно вашему требованию.

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

 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()); } };