gpt4 book ai didi

安卓 asmack : stateChange never called

转载 作者:搜寻专家 更新时间:2023-11-01 07:56:36 25 4
gpt4 key购买 nike

我正在使用 asmack xmpp 客户端构建一个聊天应用程序。聊天工作正常,我已经实现了 ChatStateListenerstateChanged 方法从未被调用。目前为了获得撰写状态,我正在解析消息 xml。下面是composing,text,active的消息格式。

<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 永远不会被调用。

最佳答案

我现在也在使用 aSmack 做一个项目,这就是我解决问题的方法,希望它能帮助你。我假设您已经创建了 ChatStateManager 的实例比如:

ChatStateManager chatStateManager = ChatStateManager.getInstance(connection);

然后发送composing状态,其中connection是你当前的xmpp连接,currentChatChat您为当前对话创建的



@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;
}

}

我知道这可能只是一种“变通方法”,如果阅读本文的人有更好的答案,请发布,以便我们都能从中学习。

谢谢,希望对您有所帮助。

关于安卓 asmack : stateChange never called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27186533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com