- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 asmack xmpp 客户端构建一个聊天应用程序。聊天工作正常,我已经实现了 ChatStateListener
但 stateChanged
方法从未被调用。目前为了获得撰写状态,我正在解析消息 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连接,currentChat是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具有不同的状态,在下面的例子中是一个组合状态
<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/
我正在使用 Asmack API 在 android 上创建一个多用户聊天室,我想通过使用获取所有托管的房间 MultiUserChat.getHostedRooms(connection, serv
我正在基于 asmack 库在 Android 上开发聊天应用程序。我创建了 1 个用户并在好友列表中添加了 3 个 friend 。当我使用名册显示好友列表时。我无法在好友列表中获取所有用户,只有
我正在尝试为我的聊天应用程序实现离线文件扩展。我正在使用 PacketExtension 和 EmbeddedExtensionProvider 添加和解析自定义扩展。我可以看到在发送消息时添加了值和
基本上我有一个运行整个项目的主类。该代码运行良好,但一旦应用程序失去焦点,它就会变得不活动。我想知道我将如何让它成为一项服务。一个会在启动时启动的。 该应用程序将是一种用于通知的单向消息系统。即 De
我有一个 aSmack 实现的应用程序,(8-4.0.5),据我们所知,它有一个内部重新连接管理,但它并不令人满意,因为有时我们应该等待 5 分钟才能重新连接,而我们现在知道这是一个这样做的好时机,所
我正在我正在开发的 Android 应用程序中使用 asmack xmpp 客户端,并希望使用压缩。我找到了 setCompressionEnabled,但当我尝试它时,它告诉我我需要 smackx。
我正在使用 asmack 库,并面临多用户聊天请求的问题。 发送 session 请求时,它不会进入邀请监听器,尽管相同的代码在 java 中使用 smack 库。 调试时它显示我正在接收消息,但没有
我完全按照答案建议的操作( Asmack not loading VCard ),但它仍然不起作用。 DEBUG 输出显示 Smack 收到带有 VCard 信息的数据包,但随后在 https://g
我正在努力让 aSmack 在我的项目中发挥作用。在 eclipse 中创建一个标准项目,添加 jar 以构建路径/库。开始使用 XMPP 类,但我不确定我是否应该做其他事情来正确设置项目(稍后再说)
我正在开发 Android 平台上的聊天应用程序。我想通过 xmpp 库中的 PubSub 共享我的当前位置。谁能给我代码,说明如何使用 pubsub API。 提前致谢。 最佳答案 Smack do
我建立了一个基于 aSmack 的应用程序,显然所有关于连接的东西都在一个服务中运行,所以保持它的连接是非常重要的,因为我们知道在后台运行的服务可能会在手机资源不足时被杀死(通常是 Ram),因此在服
我在我的 android 应用程序中使用 aSmack 库进行群聊,我的问题是有时当连接丢失时,ReconnectionManager 无法重新连接并出现此错误: java.lang.IllegalT
我在通过 XMPP 发送图像时遇到了一个问题。下面是我完成的代码 fragment 。我不知道代码有什么问题。 Message msg = new Message(emailId, Message.T
我不熟悉 smack 库的使用和制作一个聊天应用程序。当我添加 friend 时,从这段代码..,它有效。 public void Addcontact() { Roster.setDefaul
我正在使用 Asmack 的二进制版本(我会尽快构建它,因为我第一次尝试时遇到了问题)。我还设置了自己的 ejabberd 服务器。 当我尝试加载一些联系人 VCard 时,服务器返回信息但 Asma
我尝试用 asmack 编写一个 android 演示。存在名为 “host-unknown” 的错误。我该如何解决? 这是我在 LogCat 中看到的: 03-16 08:31:10.671: I/
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
我遇到了 XML 节中缺少属性的问题。根据服务器端的日志文件,我可以确认属性是从客户端发送到服务器的。此外,当服务器将 XML 节传递给接收者时,该属性也存在(仍然基于服务器端的日志文件)。问题是,当
我无法使用 asmack 接收文件,但我能够发送文件。下面是接收文件的代码,请告诉我我做错了什么 ServiceDiscoveryManager serv= new Ser
我正在使用 openfire 和 asmack 库。我正在 android 聊天应用程序中实现在线 和离线 按钮。如何将我的在线状态设置为“不可用”。 注意:我不想使用connection.disco
我是一名优秀的程序员,十分优秀!