Android 如何在Smack中启用XEP-0199?

Android 如何在Smack中启用XEP-0199?,android,xmpp,ping,smack,asmack,Android,Xmpp,Ping,Smack,Asmack,我在用aSmack。我的应用程序监听聊天室并对消息做出反应,但它从不发送消息。如果聊天室保持沉默一段时间,然后发送新消息,则应用程序不会收到更多消息。我研究过,我认为这就是解决办法。我看到@Flow(当前的Smack维护者)被关闭了 我认为我需要使用,但我真的不知道如何将这个类与连接连接起来 我如何才能启用?我如何使用 连接代码: smack = SmackAndroid.init(getActivity().getApplicationContext()); connection = new

我在用aSmack。我的应用程序监听聊天室并对消息做出反应,但它从不发送消息。如果聊天室保持沉默一段时间,然后发送新消息,则应用程序不会收到更多消息。我研究过,我认为这就是解决办法。我看到@Flow(当前的Smack维护者)被关闭了

我认为我需要使用,但我真的不知道如何将这个类与
连接连接起来

我如何才能启用?我如何使用


连接代码:

smack = SmackAndroid.init(getActivity().getApplicationContext());
connection = new XMPPConnection(App.getServer());
connection.addConnectionListener(new ConnectionListener() {

    private final static String SMACK = "SMACK";

    @Override
    public void reconnectionSuccessful() {
        Log.i(SMACK , "reconnectionSuccessful");
    }

    @Override
    public void reconnectionFailed(Exception e) {
        Log.i(SMACK, "reconnectionFailed", e);
    }

    @Override
    public void reconnectingIn(int seconds) {
        Log.i(SMACK, "reconnectingIn " + seconds);
    }

    @Override
    public void connectionClosedOnError(Exception e) {
        Log.i(SMACK, "connectionClosedOnError", e);
    }

    @Override
    public void connectionClosed() {
        Log.i(SMACK, "connectionClosed");
    }
});
connection.connect();
connection.login(user, password);

XEP 0199
不是解决方案,Ping用于检查服务器是否启动。实际上,您将向服务器发送ping

现在就你的问题而言。给我看看你要发送的信息节。还要检查聊天室是公共的还是私人的。您不能向私人聊天室发送消息

答案更新:

尝试使用此代码检测消息接收

PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        Network.connection.addPacketListener(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 + "]");
                   //recieve.setText(message.getBody());
                    /*messages.add(fromName + ":");
                    messages.add(message.getBody());*/
                    // Add the incoming message to the list view
                    item = new RowItem(R.drawable.billing, message.getBody());
                    adapter = new CustomListViewAdapter(getBaseContext(),
                            R.layout.list_item, rowItems);
                    rowItems.add(item);
                    //listView.setAdapter(adapter);
                }
            }
        }, filter);

我修复了手动实现ping响应的问题:

connection.addPacketListener(new PacketListener() {

    @Override
    public void processPacket(Packet packet) {
        connection.sendPacket(new Pong((Ping) packet));
    }
}, new PacketFilter() {

    @Override
    public boolean accept(Packet packet) {
        return packet instanceof Ping;
    }
});

我调用了
PingManager.getInstanceFor
方法来启用XEP-0199支持。

以防止用户断开您的会话

PingManager pm =  PingManager.getInstanceFor(MyApplication.connection) ;
    pm.setPingInterval(5) ;  // 5 sec
    pm.pingMyServer() ;
    pm.registerPingFailedListener(new PingFailedListener() {

        @Override
        public void pingFailed() {
            Log.e(TAG , "pingFailed") ;
        }
    });

我不想发任何信息。我只想在很长一段时间内收到所有的信息。但当聊天室沉默了一段时间后,我似乎失去了连接,但我没有通过
连接列表收到任何事件。在我的测试中,该应用程序始终处于前台,屏幕处于打开状态。我只是在我的问题中添加了它。我想指出,如果在移动连接上使用5秒的ping间隔,将很快耗尽设备的电池电量。如果用户在未首先通知openfire的情况下脱机,这将是一个大问题,openfire将假定客户端已收到数据包,因此在登录时不会再次发送数据包。例如,用户A在线用户B向用户发送MUC邀请A在收到邀请前已脱机,但未通知openfire用户B将假定A已收到邀请,且邀请已丢失pong是什么?你能解释一下吗?他们似乎删除了
Pong
类。但现在,您可以尝试一下。当用户脱机时,我们如何管理?我的意思是,我们如何在按下按钮后手动停止ping manager?以接收来自FCM的通知