我正在使用asmack xmpp客户端构建聊天应用程序。聊天工作正常,我已实现ChatStateListener
,但stateChanged
方法永远不会被调用。目前为了获得作曲状态,我正在解析消息xml。以下是撰写,文本,活动的消息格式。
<message id='5ec7d' to='admin@testserver123.net' from='praveenraj@testserver123.net/682e3641' type='chat'><composing xmlns="http://jabber.org/protocol/chatstates" /></message>
<message id='9a93f22' to='admin@testserver123.net' from='praveenraj@testserver123.net/682e3641' type='chat'><body>hi</body><active xmlns="http://jabber.org/protocol/chatstates" /></message>
<message to='admin@testserver123.net' from='praveenraj@testserver123.net/682e3641' type='chat'><active xmlns="http://jabber.org/protocol/chatstates" /></message>
但解析xml以获得编写状态并不是一个好主意。有人可以帮助我理解为什么stateChanged
永远不会被召唤。
答案 0 :(得分:4)
我正在使用aSmack正在开发一个项目,这就是我解决问题的方法,希望它可以帮到你。 我假设您已创建ChatStateManager的实例,例如:
ChatStateManager chatStateManager = ChatStateManager.getInstance(connection);
然后发送撰写状态,其中连接是您当前的xmpp连接, currentChat 是聊天您为当前对话创建了
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(connection != null){
try {
chatStateManager.setCurrentState(ChatState.composing, currentChat);
} catch (Exception e) {
e.printStackTrace();
}
}
}
其他客户会向您发送一个Packet个不同的状态,在下面的情况下是撰写状态
<message id='16vn2-83' to='jabberusername@ip-address' from='jabberusername@ip-address' type='chat'><thread>781de2f5-8883-4b16-a3b2-3bf7aff1efe9</thread><composing xmlns="http://jabber.org/protocol/chatstates" /></message>
现在这就是它变得有趣的地方(回答你的问题)。我抓住每个传入的数据包并将其发送给BroadcatsReceiver以通知我。请注意,如果传入的数据包有 null 正文,这意味着它不是带有文本的实际消息,而是 ChatState 消息。
if (packet.getBody() == null) {
Intent i = new Intent();
i.setAction(Constants.ACTION_TYPING_LISTENER);
i.putExtra(Constants.ACTION_EXTRA_WHO_TYPING, getSimpleUsername(packet.getFrom()));
if (isIncomingComposingMessage(msg.toXML().toString())) {
i.putExtra(Constants.ACTION_EXTRA_MESSAGESTATE, ChatState.composing.toString());
} else {
i.putExtra(Constants.ACTION_EXTRA_MESSAGESTATE, ChatState.paused.toString());
}
sendBroadcast(i);
}
和
public boolean isIncomingComposingMessage(String xmlMessage) {
if (xmlMessage.indexOf(ChatState.composing.toString()) == -1) {
return false;
} else {
return true;
}
}
我知道这可能只是一个&#34;解决方法&#34;如果有人读到这个有更好的答案,请发布,以便我们都可以从中学习。
谢谢,我希望它有所帮助。
答案 1 :(得分:0)
如果您查找Asmack lib,那么您可以看到方法updateChatState(Chat paramChat, ChatState paramChatState)
将检查您当前的状态是否与旧状态相同,如果是,那么该方法返回false,这就是您的原因每次都没有收到回调。
为什么会这样?
//Asmack lib method
private boolean updateChatState(Chat paramChat, ChatState paramChatState) {
ChatState localChatState = (ChatState) this.chatStates.get(paramChat);
if (localChatState != paramChatState) {
this.chatStates.put(paramChat, paramChatState);
return true;
}
return false;
}
如果你想在每次做某事的时候收到回叫 下面,
public class ChatlListener implements MessageListener, ChatStateListener{
@Override
public void stateChanged(Chat paramChat, ChatState paramChatState) {
// this method will call only if status change , not on same status
}
@Override
public void processMessage(Chat paramChat, Message paramMessage) {
ChatStateExtension chatStateExtension = (ChatStateExtension) paramMessage.getExtension("http://jabber.org/protocol/chatstates") ;
Log(TAG,"Current chat status : " + chatStateExtension.getElementName());
}
}