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