[英]How to know Typing Status in XMPP openfire using Smack
I am developing chat application by using Openfire XMPP server.我正在使用 Openfire XMPP 服务器开发聊天应用程序。 I can text chat between two user.
我可以在两个用户之间进行文字聊天。 But i want to know Typing status when some one is typing message.
但是我想知道有人在输入消息时的输入状态。 So i created a class :-
所以我创建了一个类:-
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());
}
}
But i am confuse so that How will it work?但我很困惑,这将如何工作? I know that i need a packet where i can it in Listener.
我知道我需要一个可以在 Listener 中使用的数据包。 But i am unable to find that packet.
但是我找不到那个包。
Please any one suggest, How will it work?请任何人建议,它将如何工作?
and also what is difference between Smack and asmack?还有 Smack 和 asmack 有什么区别?
Thank you!谢谢!
To enable ChatStateListener
you need to create a custom MessageListener
Class要启用
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());
}
}
}
Then you create MessageListener
object然后你创建
MessageListener
对象
MessageListener messageListener = new MessageListenerImpl();
And then pass this in the create chat method然后在创建聊天方法中传递这个
Chat newChat = chatmanager.createChat(jabber_id_of_friend, messageListener);
what is difference between Smack and asmack? Smack 和 asmack 和有什么不一样? <-- Check This
<--检查这个
finally I got the solution.最后我得到了解决方案。 I need to use chat listener along with chat manager and also I need to use in built sendcomposingnotification function.
我需要将聊天侦听器与聊天管理器一起使用,并且还需要在内置的sendcomposingnotification函数中使用。 No need to use Messageeventrequestlistener interface or any other custom class for this.
无需为此使用 Messageeventrequestlistener 接口或任何其他自定义类。 I added the following lines,,
我添加了以下几行,
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();
}
}
});
}
});
and also need to send notification like this..并且还需要发送这样的通知..
mem.sendComposingNotification(etRecipient.getText().toString(), message.getPacketID());
System.out.println("Sending notification");
where mem is type of MessageEventManger.其中 mem 是 MessageEventManger 的类型。 Ref: http://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/MessageEventManager.html
参考: 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");
}
});
use this code.hope so will work使用此代码。希望这样会起作用
i am using chat state listener :我正在使用聊天状态侦听器:
Chat chat = chatManager.createChat(jid,
new ChatStateChangedListener());
bind the chatstatelistener with each jid like above , then :像上面一样将 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");
}
}
}
}
Create On Class MMessageListener to listen incoming messages在类 MMessageListener 上创建以侦听传入消息
private class MMessageListener implements MessageListener, ChatStateListener {私有类 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) {
}
}
Add Listener to your chat object将 Listener 添加到您的聊天对象
Chat Mychat = ChatManager.getInstanceFor(connection).createChat( "user2@localhost"), mMessageListener); Chat Mychat = ChatManager.getInstanceFor(connection).createChat("user2@localhost"), mMessageListener);
Send status to receiving user on edittext text change在编辑文本文本更改时将状态发送给接收用户
ChatStateManager.getInstance(connection).setCurrentState(ChatState.composing, Mychat); ChatStateManager.getInstance(connection).setCurrentState(ChatState.composing, Mychat);
This works fine for me.这对我来说很好用。
Your or another xmpp client which you use, should sending chat state for You can catch the state.您或您使用的其他 xmpp 客户端应该发送聊天状态,以便您可以捕捉状态。
Like This;像这样;
try {
ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.composing, chat);
} catch (XMPPException e) {
e.printStackTrace();
}
or或者
try {
ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.gone, chat);
} catch (XMPPException e) {
e.printStackTrace();
}
However you can get it from ProcessPacket also.但是,您也可以从 ProcessPacket 获取它。 there you will get a Message object, after you can extract xml portion from there and handle them its contain specific chatstate or not.
在那里你会得到一个 Message 对象,你可以从那里提取 xml 部分并处理它们是否包含特定的聊天状态。
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
}
now handle as per your requirement.现在按照您的要求处理。
Just add ChatStateManager
after ChatManager
intalization:只需在
ChatStateManager
后ChatManager
ChatStateManager:
chatManager = ChatManager.getInstanceFor(getXmpptcpConnection());
ChatStateManager.getInstance(getXmpptcpConnection());
Then you need to add ChatStateListener
during createChat(to,chatMesageListener)
:然后你需要在
createChat(to,chatMesageListener)
期间添加ChatStateListener
:
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());
}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.