0

我正面临使用来自 XMPP Mongoose 服务器的 smack api 在 android 应用程序中检索离线消息的问题。根据代码流尝试在用户登录 xmpp mongoose 服务器时检索离线消息,然后再将可用状态发送到 mongoose 服务器。

尝试了两种不同的方式来检索离线消息仍然无法找到相同的工作解决方案。我尝试过的这两种方法都在下面详细解释。

在我们用于 xmpp 连接和所有其他扩展的 Api 下方:

// Smack(XMPP 客户端库)</p>

编译'org.igniterealtime.smack:smack-android:4.1.6'


编译'org.igniterealtime.smack:smack-tcp:4.1.6'

编译 'org.igniterealtime.smack:smack-im:4.1.6' </p>

编译'org.igniterealtime.smack:smack-android-extensions:4.1.6'

尝试使用 offlineMessageManager 检索离线消息

下面是我在登录后和将可用状态发送到服务器之前尝试检索离线消息的代码

试试 { </p>

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval(); </p>

迭代器 i = (迭代器) offlineMessageManager.getMessages(); </p>

而 (i.hasNext())

{ 消息消息 = i.next(); System.out.println("得到文本 [" + msg.getBody() + "] 从 [" + msg.getFrom() + "]");


} 捕捉(XMPPException e)

{ System.out.println("错误离线消息。"); e.printStackTrace(); }

捕捉(SmackException.NotConnectedException e)

{ System.out.println("错误离线消息。无连接"); e.printStackTrace(); }

捕捉(SmackException.NoResponseException e)

{ System.out.println("错误离线消息。无响应"); e.printStackTrace(); }

问题案例1:

以下是执行上述代码时生成的异常详细信息

在下面的代码行执行时出现异常。

迭代器 i = (迭代器) offlineMessageManager.getMessages(); </p>

以下是上述行执行时生成的异常描述

org.jivesoftware.smack.XMPPException$XMPPErrorException: XMPPError: service-unavailable - 取消

问题案例 2:

如果检查是使用来自 xmmp mongoose 服务器的 smack 从 android 代码支持的灵活离线消息,那么我得到了错误值。下面是我用于测试的代码。

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();

问题案例 3:

当我尝试使用下面的 smack 代码使用下面的方法检索支持的功能时。

ServiceDiscoveryManager 经理 = ServiceDiscoveryManager

.getInstanceFor(连接);

列出 AllFetures = manager.getFeatures();

以下是我检索的功能列表:

http://jabber.org/protocol/bytestreams ,

jabber:iq:privacy, urn:xmpp:ping,

http://jabber.org/protocol/commands ,

jabber:智商:版本,

jabber:智商:最后,

http://jabber.org/protocol/xdata-validate

http://jabber.org/protocol/xhtml-im ,

电子名片温度,

http://jabber.org/protocol/chatstates ,

瓮:xmpp:收据,瓮:xmpp:时间,

http://jabber.org/protocol/xdata-layout ,

http://jabber.org/protocol/muc ,

http://jabber.org/protocol/disco#items ,

http://jabber.org/protocol/disco#info ,

http://jabber.org/protocol/caps ,

jabber:x:数据

尝试使用来自 XMPP MongooseIM 的包侦听器检索离线消息

下面是我尝试使用来自 smack api 4.1.6 的包侦听器的代码。

private static final StanzaFilter MESSAGE_PACKET_FILTER= new OrFilter(StanzaTypeFilter.MESSAGE);

配置 = XMPPTCPConnectionConfiguration.builder()

            .setServiceName(SERVICE_NAME)

            .setHost(KDevelopmentXMPPServer)

            .setPort(PORT)

            .setSendPresence(false)

            .build();

// 使用配置的详细信息创建 xmpp 连接的 Connection 对象

连接 = 新 XMPPTCPConnection(配置);

connection.addAsyncStanzaListener(新的 StanzaListener() {

            @Override

            public void processPacket(Stanza packet) throws SmackException.NotConnectedException {


                Log.d("CheckPacket", "OfflineMEssage");


                Message message = (Message) packet;

                if (message != null) {

                    if (message.getBody() != null) {



                        Log.i("XMPPClient", "Got text [" + message.getBody()

                                + "] from [" + message.getFrom() + "]");



                    }

                }



            }

        }, MESSAGE_PACKET_FILTER);

connection.login(用户,密码);

提前致谢,请任何人帮助我为我的关键问题找到最佳工作解决方案。

4

2 回答 2

0

问题在于在发送初始状态之前尝试获取离线消息。XEP-0160状态:

当接收者下一次向服务器发送非否定的可用存在时,服务器将消息传递给已发送该存在的资源。[...]

MongooseIM 按照此建议工作。

您已经指出了所发出的信号isFlexibleRetrievalSupport- 服务器不支持灵活的离线消息检索。

于 2016-04-06T08:23:36.023 回答
0

我知道我写这篇文章太晚了,但是如果像我这样正在寻找与“如何在 android 应用程序中保存和获取存档消息”相同的查询的人可以参考这个答案:

注意: 这是在最新版本中实现的

要求:

  1. 截至目前的最新开火4.1.4
  2. 在 openfire 中安装 Archives 插件
    MamManager mamManager = MamManager.getInstanceFor(connection);
    boolean isSupported = mamManager.isSupportedByServer();
    if (isSupported) {
        MamManager.MamQueryResult mamQueryResult = mamManager.queryArchive(500);
        List<Forwarded> forwardedMessages = mamQueryResult.forwardedMessages;
        Forwarded d = forwardedMessages.get(0);
    }

请参考:MamManager 类的文档

于 2017-05-13T11:26:32.290 回答