Cómo saber Typing Status en XMPP openfire usando Smack

Estoy desarrollando aplicaciones de chat usando el servidor Openfire XMPP. Puedo enviar mensajes de texto entre dos usuarios. Pero quiero saber el estado de escritura cuando alguien está escribiendo un mensaje. Así que creé una clase: –

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

Pero estoy confundido, así que ¿cómo va a funcionar? Sé que necesito un paquete donde pueda en Listener. Pero no puedo encontrar ese paquete.

Por favor, cualquiera sugiera, ¿cómo va a funcionar?

y también ¿cuál es la diferencia entre Smack y Asmack?

¡Gracias!

Para habilitar ChatStateListener , debe crear una Clase MessageListener personalizada

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

Luego creas el objeto MessageListener

 MessageListener messageListener = new MessageListenerImpl(); 

Y luego pasa esto en el método de crear chat

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

¿Cuál es la diferencia entre Smack y Asmack? <- Verifique esto

finalmente obtuve la solución. Necesito usar el oyente de chat junto con el administrador de chat y también tengo que usar la función incorporada de notificación de composición . No es necesario utilizar la interfaz Messageeventrequestlistener ni ninguna otra clase personalizada para esto. Agregué las siguientes líneas ,,

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

y también necesita enviar una notificación como esta ..

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

donde mem es tipo de MessageEventManger. Ref: 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"); } }); 

usa este código. Espero que funcione

Estoy usando el oyente de estado de chat:

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

ate al chatstatelistener con cada jid como se muestra arriba, luego:

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

Crear en la clase MMessageListener para escuchar los mensajes entrantes

clase privada MMessageListener implementa 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) { } } 

Agregar Listener a su objeto de chat

Chat Mychat = ChatManager.getInstanceFor (conexión) .createChat (“usuario2 @ localhost”), mMessageListener);

Enviar estado al usuario receptor en el texto de edición cambio

ChatStateManager.getInstance (connection) .setCurrentState (ChatState.composing, Mychat);

Esto funciona bien para mi.

Su u otro cliente xmpp que utilice, debe enviar el estado de chat para que pueda captar el estado.

Me gusta esto;

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

o

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

Sin embargo, también puede obtenerlo desde ProcessPacket. allí obtendrá un objeto Message, después de que pueda extraer la porción xml desde allí y manejarlos, contiene un chatstate específico o no.

  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 } 

ahora maneje según su requisito.

Simplemente agregue ChatStateManager después de la ChatManager ChatManager:

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

Luego debe agregar ChatStateListener durante 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()); } };