我现在也在使用 aSmack 进行一个项目,这就是我解决问题的方法,希望它可以帮助你。
我假设您已经创建了一个实例聊天状态管理器 https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smackx/chatstates/ChatStateManager.html例如:
ChatStateManager chatStateManager = ChatStateManager.getInstance(connection);
然后发送构成州,哪里联系是您当前的 xmpp 连接,并且当前聊天 is the Chat您为当前对话创建的
@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 https://www.igniterealtime.org/builds/smack/docs/latest/javadoc/org/jivesoftware/smack/packet/Packet.html对于不同的状态,在下面的情况下是构成 state
<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>
现在这就是有趣的地方(回答你的问题)。我抓取每个传入的数据包并将其发送到广播接收器以通知我。请注意,如果传入数据包有null正文意味着它不是带有文本的实际消息,而是聊天状态信息。
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);
}
And
public boolean isIncomingComposingMessage(String xmlMessage) {
if (xmlMessage.indexOf(ChatState.composing.toString()) == -1) {
return false;
} else {
return true;
}
}
我知道这可能只是一个“解决方法”,如果阅读本文的人有更好的答案,请发布它,以便我们都可以从中学习。
谢谢你,希望有帮助。