【问题标题】:Missing Offline messages asmack (Android)缺少离线消息 asmack (Android)
【发布时间】:2015-12-04 11:28:18
【问题描述】:

我在 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 无法捕获那些离线消息。请帮助我

【问题讨论】:

  • 嗨@Phanindra。你有没有找到任何解决方案。我也陷入了同样的境地。

标签: android xmpp openfire asmack


【解决方案1】:

Asmack 已弃用。使用Smack。一个用 Java 编写的用于 JVM 和 Android 的开源 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'

【讨论】:

    【解决方案2】:

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

    如果这不能解决您的问题,请访问您的本地服务器并搜索离线消息,然后选择始终存储选项,将存储限制设置为 1000 kb。默认为 100 kb。 希望这行得通。

    【讨论】:

      【解决方案3】:

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

      @覆盖 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 发送为“可用”。如果还有问题,请告诉我。

      【讨论】:

      • 嗨@Ravi,你能分享一下什么是userType
      • 找不到客户端设置
      猜你喜欢
      • 2014-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      相关资源
      最近更新 更多