缺少脱机消息asmack(Android)

缺少脱机消息asmack(Android),android,xmpp,openfire,asmack,Android,Xmpp,Openfire,Asmack,我在openfire服务器中启用了脱机消息选项。但我无法获取脱机消息 用户A在线,用户B在线,在这种情况下,我可以获取消息 现在用户B关闭了他的WiFi(注意:用户A等待用户B会话在服务器中完全终止) 现在用户A向用户B发送消息 在这种情况下,我可以在openfire脱机表中看到消息 现在用户B再次联机,服务器将向用户B发送消息,因为服务器知道用户B已联机 (消息从脱机消息表中消失) 但是用户B不会收到该消息 connection.login(userName, userPwd, UiUtil

我在openfire服务器中启用了脱机消息选项。但我无法获取脱机消息

用户A在线,用户B在线,在这种情况下,我可以获取消息

现在用户B关闭了他的WiFi(注意:用户A等待用户B会话在服务器中完全终止)

现在用户A向用户B发送消息

在这种情况下,我可以在openfire脱机表中看到消息

现在用户B再次联机,服务器将向用户B发送消息,因为服务器知道用户B已联机 (消息从脱机消息表中消失)

但是用户B不会收到该消息

connection.login(userName, userPwd,  UiUtility.getMyPhoneNO());
PacketFilter filter = new PacketTypeFilter(org.jivesoftware.smack.packet.Message.class);
packetListener =new PacketListener() {
public void processPacket(Packet packet) {
Message message = (Message) packet;


if (message.getBody() != null) {
  String fromName = StringUtils.parseBareAddress(message
  .getFrom());
  Log.i("XMPPClient", "Got text [" + message.getBody()
  + "] from [" + fromName + "]");
   }
  }
  };
   connection.addPacketListener(packetListener, filter);

再次成功登录后,我可以正常聊天。但我想知道为什么那些离线消息会丢失。我的PacketListener无法捕获那些脱机邮件。请帮助我,因为邮件已被弃用。使用。一个为JVM和Android用Java编写的开源XMPP客户端库。将以下行添加到gradle文件:

compile 'org.igniterealtime.smack:smack-android:4.1.3'
compile 'org.igniterealtime.smack:smack-tcp:4.1.3'
compile 'org.igniterealtime.smack:smack-extensions:4.1.3'

这个问题很容易解决。 在连接XMPP服务器之前,只需使用ASmack库提供的ProviderManager类注册提供程序

如果这无法解决您的问题,请访问您的本地服务器并搜索脱机邮件,然后选择“始终存储”选项,将存储限制设置为1000 kb。默认为100KB。
希望这能奏效。

经过一番努力,我已经解决了这个问题。在openfire管理页面中,转到“客户端设置”,并将空闲时间从360秒(默认)减少到1秒(可能是)。只有当你们断开和Internet的连接时,它才能检测到你们处于脱机状态,并将其余的邮件保留为脱机状态

@凌驾 public void onNetworkConnectionChanged(布尔值未连接){

if(未连接){
新线程(){
公开募捐{
试一试{
XMPPTCPConnectionConfiguration.Builder=XMPPTCPConnectionConfiguration.Builder();
builder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
builder.setUserName和密码(“电话”、“管理员”);
builder.setSendPresence(真);
builder.setServiceName();
setHost();
builder.setResource(“测试”);
builder.setDebuggerEnabled(true);
状态=新状态(Presence.Type.available);
存在。设置状态(“可用”);
连接=新的XMPPTCPConnection(builder.build());
connection.connect();
connection.login();
Presence Presence 123=新的状态(Presence.Type.available);
存在123.设置状态(“可用”);
试一试{
连接。发送节(presence123);
}捕捉(SmackException.NotConnectedException e){
e、 printStackTrace();
}
StanzaFilter=newandfilter(newstanzatypefilter(Message.class));
PacketListener myListener=新建PacketListener()
{
公共无效处理包(节)
{
retrieveMessage(节,用户类型);
}
};
addPacketListener(myListener,filter);
试一试{
连接。发送节(存在);
}捕捉(SmackException.NotConnectedException e){
e、 printStackTrace();
}
}捕获(SmackException | XMPPException | IOE异常){
e、 printStackTrace();
}
//返回连接。断开连接();
}
}.start();

以上操作正常,能够检索脱机消息。“retrieveMessage(节,用户类型);”方法用于处理传入消息并更新适配器。请确保以“可用”状态发送状态信息当你重新连接时。请告诉我是否还有任何问题。

Hi@Phanindra。你找到任何解决方案了吗。我也遇到了同样的情况。Hi@Ravi,你能分享什么是用户类型找不到客户端设置吗
    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();