如何使用 aSmack 获取 MultiUserChat 房间的 DiscussionHistory?

Posted

技术标签:

【中文标题】如何使用 aSmack 获取 MultiUserChat 房间的 DiscussionHistory?【英文标题】:How to get DiscussionHistory for MultiUserChat room using aSmack? 【发布时间】:2013-04-05 10:42:44 【问题描述】:

如何从MultiUserChat 获取MUC 房间的讨论历史?我可以使用 aSmack 库创建 MultiUserChat 实例和房间,现在我想显示房间中发生的所有先前对话。

任何有相同经验的人请帮助我。我在 Google 上搜索了很多关于此的内容,但我仍然没有得到任何适当的文档/解释。

【问题讨论】:

【参考方案1】:
DiscussionHistory history = new DiscussionHistory();
history.setSince(date);

muc.join(nickname, null, history, SmackConfiguration.getReplyTimeout());

// Get historical message;
Message oldMsg = muc.nextMessage(timeout);

你也可以使用

history.setMaxChars()
history.setMaxStanzas()
history.setSeconds()

一些示例在测试代码中。检查测试testDiscussionHistory

http://fisheye.igniterealtime.org/browse/smack/trunk/test/org/jivesoftware/smackx/muc/MultiUserChatTest.java?hb=true

【讨论】:

这里需要为 MUC 维护相同的实例,或者我们可以创建任何我们想要的。如果单个实例需要如何在整个应用程序中将该 MUC 维护为单个实例。 在这里,通过使用您的代码,我只收到来自历史记录的一条消息(即第一条消息)。即使我设置了history.setMaxStanzas(20)。我想从这段历史中获得最后 20 条消息。请帮助我。 您只需多次调用 nextMessage 即可。每次调用都会检索下一条消息。最终,您将检索所有历史消息并阻止等待下一个实时消息。 我这里有一个问题,当我进入一个房间时,我正在正确获取该房间的历史记录。当我立即从那个房间去另一个房间时,我在这条线上得到了 NPE Message oldMsg = muc.nextMessage(timeout); 如何避免即使用户随时进入不同的房间..还有 timeout 这里的最佳价值是什么跨度> 这取决于应用程序。只需检查 null 的返回值。如果你想无限期地阻塞,你可以调用不带参数的 nextMessage() 。这永远不会返回 null,因为除非有另一条消息可用,否则它不会返回。这将需要中断来停止等待,这会使事情变得更加复杂。

以上是关于如何使用 aSmack 获取 MultiUserChat 房间的 DiscussionHistory?的主要内容,如果未能解决你的问题,请参考以下文章

在 asmack QuickBlox 中获取扩展房间信息

Android with Asmack - 当我连接到 XMPP 时如何获取当前状态信息?

如何在 Android aSmack 中实现 DeliveryReceiptManager

在android中使用asmack获取错误的请求400错误

无法使用 asmack 版本 asmack-android-8-4.0.6.jar 在 xmpp 中返回组列表

无法使用 Gtalk 应用程序的 asmack api 获取离线消息