【问题标题】:not getting offline messages with smack没有收到带有 smack 的离线消息
【发布时间】:2018-05-31 04:54:53
【问题描述】:

我正在尝试使用 openfire、smack 和 android 的聊天应用程序,其中离线消息不起作用。如果两个用户都在线,则能够正确发送和接收消息。但是,如果用户 A 离线并且用户 B 发送消息,则用户 A 一旦在线就不会收到 B 发送的消息。尝试了来自 stackoverflow 的可能解决方案,但都没有工作。使用以下代码检索离线消息。

新线程(){ 公共无效运行(){

            XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()

                    .setSocketFactory(SocketFactory.getDefault())

                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)

                    .setServiceName("123.456.0.854")//service name

                    .setHost("123.456.0.854") // host name 

                    .setPort(5222) //port

                    .setUsernameAndPassword("phone", "admin")
                    .setConnectTimeout(40000)

                    .setCompressionEnabled(false).build();

            connection = new XMPPTCPConnection(config);

            try {
                connection.connect();
                connection.login("phone", "admin");
                Presence presence = new Presence(Presence.Type.available);
                presence.setStatus("Available");
                try {
                    connection.sendStanza(presence);
                } catch (SmackException.NotConnectedException e) {
                    e.printStackTrace();
                }
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XMPPException e) {
                e.printStackTrace();
            }



            OfflineMessageManager offlineMessageManager = new OfflineMessageManager(connection);

            try {
                System.out.println("Count is " +offlineMessageManager.getMessageCount());
            } catch (SmackException.NoResponseException e) {
                e.printStackTrace();
            } catch (XMPPException.XMPPErrorException e) {
                e.printStackTrace();
            } catch (SmackException.NotConnectedException e) {
                e.printStackTrace();
            }

        }
    }.start(); 

【问题讨论】:

    标签: android xmpp openfire smack


    【解决方案1】:

    经过一番挣扎,我已经解决了这个问题。在您的 openfire 管理页面中,转到“客户端设置”并将空闲时间从 360 秒(默认)减少到 1 秒(可能)。只有当您断开与 Internet 的连接时,它才能检测到您处于离线状态,并将其余消息保存为离线。

    @Override public void onNetworkConnectionChanged(boolean isConnected) {

    if(isConnected){
        new Thread() {
    
            public void run() {
                try {
                    XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder();
                    builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
                    builder.setUsernameAndPassword("phone", "admin");
                    builder.setSendPresence(true);
                    builder.setServiceName(<Service name>);
                    builder.setHost(<Host name>);
                    builder.setResource("Test");
                    builder.setDebuggerEnabled(true);
                    Presence presence = new Presence(Presence.Type.available);
                    presence.setStatus("Available");
                    connection = new XMPPTCPConnection(builder.build());
                    connection.connect();
                    connection.login();
                    Presence presence123 = new Presence(Presence.Type.available);
                    presence123.setStatus("Available");
                    try {
                        connection.sendStanza(presence123);
                    } catch (SmackException.NotConnectedException e) {
                        e.printStackTrace();
                    }
                    StanzaFilter filter = new AndFilter(new StanzaTypeFilter(Message.class));
                    PacketListener myListener = new PacketListener()
                    {
                        public void processPacket(Stanza stanza)
                        {
                            retrieveMessage(stanza,userType);
                        }
                    };
                    connection.addPacketListener(myListener, filter);
                    try {
                        connection.sendStanza(presence);
                    } catch (SmackException.NotConnectedException e) {
                        e.printStackTrace();
                    }
    
                } catch (SmackException | XMPPException | IOException e) {
                    e.printStackTrace();
                }
    
    
                //return connection.isConnected();
            }
    
        }.start(); 
    

    以上工作正常并且能够检索离线消息。方法“retrieveMessage(stanza,userType);”用于处理传入的消息并更新Adapter。确保在重新连接时将 Presence 发送为“可用”。如果还有问题,请告诉我。

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 2020-12-14
      • 1970-01-01
      • 2020-07-15
      相关资源
      最近更新 更多