首页 文章

离线消息不能从xmpp MongooseIM服务器的smack api 4.1.6中恢复

提问于
浏览
0

我正面临着使用来自XMPP Mongoose服务器的smack api在Android应用程序中检索离线消息的问题 . 根据代码流尝试在用户在mmpo服务器上发送可用状态之前登录xmpp mongoose服务器时检索脱机消息 .

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

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

// Smack(XMPP客户端库)

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

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

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

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

Tried retrive offline message Using offlineMessageManager

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

尝试{

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();

Iterator i =(Iterator)offlineMessageManager.getMessages();

while(i.hasNext())

{Message msg = i.next(); System.out.println(“来自[”msg.getFrom()“]”的Got text [“msg.getBody()”);

} catch(XMPPException e)

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

catch(SmackException.NotConnectedException e)

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

catch(SmackException.NoResponseException e)

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

Issue case 1:

下面是上面代码执行时生成的异常细节

在下面的代码行执行时我得到了Exception .

Iterator i =(Iterator)offlineMessageManager.getMessages();

下面是异常描述,它在行执行时生成

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

Issue Case 2:

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

Boolean isFelxibleRetrievalSupport = offlineMessageManager.supportsFlexibleRetrieval();

Issue Case 3:

当我尝试使用下面的方法使用下面的方法检索支持的功能时 .

ServiceDiscoveryManager manager = ServiceDiscoveryManager

.getInstanceFor(连接);

List AllFetures = manager.getFeatures();

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

http://jabber.org/protocol/bytestreams

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

http://jabber.org/protocol/commands

胡言乱语:智商:版本,

胡言乱语:智商:最后,

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

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

电子名片,温度,

http://jabber.org/protocol/chatstates

urn:xmpp:receipts,urn:xmpp:time,

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

闲聊:X:数据

Tried to retreive offline message Using package listener from XMPP MongooseIM

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

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

configuration = XMPPTCPConnectionConfiguration.builder()

.setServiceName(SERVICE_NAME)

            .setHost(KDevelopmentXMPPServer)

            .setPort(PORT)

            .setSendPresence(false)

            .build();

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

connection = new XMPPTCPConnection(配置);

connection.addAsyncStanzaListener(new 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(用户,密码);

在此先感谢,请帮助我为我的关键问题提供最佳解决方案 .

2 回答

  • 0

    问题在于尝试获取离线消息 before 发送初始状态 . XEP-0160州:

    当收件人下一次向服务器发送非负可用状态时,服务器会将消息传递给已发送该状态的资源 . [...]

    MongooseIM按照这个建议工作 .

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

  • 0

    我知道我写这篇太晚了,但是如果像我这样的人正在寻找与 "how to save and get archive messages in android app" 相同的查询,可以参考这个答案:

    注意:这是在最新版本中实现的Requrirements:截至目前最新的openfire 4.1.4在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);
        }
    

    请参阅:Documention for MamManager Class

相关问题