Android 如何使用Smack了解XMPP openfire中的键入状态
我正在使用OpenFireXMPP服务器开发聊天应用程序。我可以在两个用户之间进行文字聊天。但我想知道有人在键入消息时的键入状态。所以我创建了一个类:-Android 如何使用Smack了解XMPP openfire中的键入状态,android,xmpp,openfire,smack,asmack,Android,Xmpp,Openfire,Smack,Asmack,我正在使用OpenFireXMPP服务器开发聊天应用程序。我可以在两个用户之间进行文字聊天。但我想知道有人在键入消息时的键入状态。所以我创建了一个类:- public class typingStatus implements ChatStateListener { @Override public void processMessage(Chat arg0, Message arg1) { // TODO Auto-generated method stub
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的区别是什么
谢谢大家! 要启用
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();
然后将其传递到createchat方法中
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的类型。
Ref:您或您使用的另一个xmpp客户端应该发送聊天状态,因为您可以捕获该状态 像这样,
try {
ChatStateManager.getInstance(GlobalVariables.xmppManager.connection).setCurrentState(ChatState.composing, chat);
} catch (XMPPException e) {
e.printStackTrace();
}
或
使用此代码。希望这样可以工作我正在使用聊天状态侦听器:
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");
}
}
}
}
在类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) {
}
}
将侦听器添加到聊天对象中
Chat Mychat=ChatManager.getInstanceFor(连接).createChat(
"user2@localhost"),
格利斯滕夫人)
在edittext文本更改时向接收用户发送状态
ChatStateManager.getInstance(connection).setCurrentState(ChatState.composing,Mychat)
这对我来说很好。但是您也可以从ProcessPacket获得它。 在您可以从中提取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
}
现在根据您的要求进行处理。只需在
ChatManager
安装后添加ChatManager
:
chatManager = ChatManager.getInstanceFor(getXmpptcpConnection());
ChatStateManager.getInstance(getXmpptcpConnection());
然后,您需要在createChat(to,chatmasagelistener)
期间添加ChatStateListener
:
谢谢sunil。看起来不错,给了我解决方案。我会检查。没有用户ID是其他参与者的jid,而不是登录到Hank you sunil的人。如果您有点时间。请检查以处理消息事件。请查看我检查过但未更改状态。请建议在Stackoverflow中检查此问题:您好,我在上面尝试过。。但不起作用!这是我的代码!如果有任何帮助,我们将不胜感激。……Message msg1=新消息(收件人,Message.Type.chat);msg1.setFrom(“user1@192.168.0.98“”;//我的id MessageEventManager事件=新建MessageEventManager(连接);//收件人id事件。sendComposingNotification(“tech1@192.168.0.98“,msg1.getPacketId());@Aneez,您需要处理在
processMessage()中收到的消息
,因为它接收所有传入的数据包,而不仅仅是键入状态的数据包。它可能是暂停、脱机/联机状态数据包或消息。因此,请尝试处理它,然后处理..嗨。我尝试了相同的方法,但对我无效..它既不发送复合通知,也不接收它。在接收和接收时都为null它来自ios。请帮助我找到这个。谢谢。仅供参考:从Hi Dharmesh合并,我也这样做了,但我在processMessage中撰写状态消息时总是得到null。我的EditText文本更改方法是:newChat=chatmanager.createChat(发送给,messageListener);message msg=new message(send_to,Message.Type.chat);msg.setFrom(USERNAME_LOGIN+“@”+HOST_NAME);//我的id newChat.sendMessage(msg);ChatStateManager.getInstance(connection).setCurrentState(ChatState.composing,newChat);这也不会将状态发送给其他人。仅供参考:合并自如何检查用户是否已暂停或不再键入EditText?可能您的服务器应用程序不支持它。您的意思是说我们的服务器未对此进行配置?但它可以在ios到ios之间正常工作。我正在EditText的textChangeListner上写这一行。聊天对象是chatmanager=connection.getChatManager();Chat Chat=chatmanager.createChat(“用户@”,listner);即使我从ios processMessage接收到撰写状态,消息也会为空。请帮助我找到发送和接收的解决方案。另外,我正在使用asmack libraryFYI:需要在EditText文本更改侦听器上进行合并。对吗?您好,Ahesanali Momin,您能告诉我您最后的具体情况吗?以及什么错误你将在XMPP中面对。有关更多信息,请在skype@piyush.gupta326向我发送消息。然后我们可以讨论更多,你的问题,并希望达到成功点。我没有收到任何错误,但当我开始键入代码时,我的意思是没有调用stateChangeListener。嘿,伙计,你读过这篇文档吗?这完全是理论,不是intere到目前为止,由于使用聊天客户端,大多数事情都非常清楚。我的意思是,请阅读该链接中的文档。我希望你能在那里找到解决方案。否则我们可以在这里讨论相同的问题。仅供参考:从供参考合并:从下次开始合并,也许只需回答一个问题并标记其余内容,让我们知道它们是重复的;发布相同的内容回答7次太过分了。
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
}
chatManager = ChatManager.getInstanceFor(getXmpptcpConnection());
ChatStateManager.getInstance(getXmpptcpConnection());
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());
}
};