Smack XMPP не возвращается после входа в систему более двух минут
Я использую smack-android:4.2.0
для создания простого приложения чата для групп. Я создал чат MUC, все, включая подписку, работает нормально. Если я выйду из системы, а затем снова войду в систему в течение 2 минут, то пользователь автоматически присоединится к группам, но если пользователь войдет в систему через 2 минуты, он не сможет присоединиться ни к одной группе.
Вот как я создаю группу
public void creatGroupTaskXMPP(String groupImageServerPath , String groupname , String userids) {
try
{
if(connection.isAuthenticated())
{
MyPreferences myPreferences = new MyPreferences(context);
MultiUserChat chatRoom = MyXMPP.multiUserChatManager.getMultiUserChat(MyXMPP.createEntityBareJID(myPreferences.getUSER_ID() + "_" + CommonMethods.getCurrentGMTTime(0) + "@conference."
+ context.getString(R.string.server)));
MyXMPP.multiUserChatManager.setAutoJoinOnReconnect(true);
MultiUserChat.MucCreateConfigFormHandle myRoom = chatRoom.createOrJoin(Resourcepart.from(AppConstants.csUserID));
if (myRoom != null) {
chatRoom.addMessageListener(multiChatMsgListener);
chatRoom.addParticipantStatusListener(mChatParticipantStatusListener);
chatRoom.addParticipantListener(MCPresenceListener);
chatRoom.addPresenceInterceptor(MCPresenceListener);
Form form = chatRoom.getConfigurationForm().createAnswerForm();
form.setAnswer("muc#roomconfig_roomname", groupname);
form.setAnswer("muc#roomconfig_persistentroom", true);
form.setAnswer("muc#roomconfig_allow_subscription", true);
form.setAnswer("muc#roomconfig_mam", true);
List<Affiliate> affiliates = chatRoom.getOwners();
chatRoom.sendConfigurationForm(form);
addSubscription(chatRoom);
ArrayList<EntityBareJid> JabberIdList = new ArrayList<EntityBareJid>();
String str[] = userids.split(",");
for (int i = 0; i < str.length; i++)
{
if(userids != null && userids.length() > 0)
JabberIdList.add(createEntityBareJID(userids + "@" + context.getString(R.string.server)));
}
JSONObject jsonObject = createJsonForInvite(str , groupImageServerPath );
for (int i = 0; i < str.length; i++)
chatRoom.invite(createEntityBareJID(str[i] + "@" + context.getString(R.string.server)), jsonObject.toString());
String room_Id[] = chatRoom.getRoom().toString().split("@");
CreatGroup.updateDB(jsonObject , room_Id[0]);
}
}
else
{
if(login())
{
creatGroupTaskXMPP(groupImageServerPath , groupname, userids);
}
}
}
catch (Exception ed)
{
ed.printStackTrace();
Logger.errorLog("Group Crate Exception Message = " + ed.getMessage());
}
}
и это мой метод подписки
public void addSubscription(MultiUserChat chatRoom)
{
String csSubId = AppConstants.csUserID + "_" + System.currentTimeMillis()/1000;
try
{
IQ iq = new IQ("subscribe", "urn:xmpp:mucsub:0") {
@Override
protected IQChildElementXmlStringBuilder getIQChildElementBuilder(IQChildElementXmlStringBuilder xml)
{
String csXMLString = xml.toString();
//xml.xmlnsAttribute();
xml.attribute("nick", AppConstants.csUserID);
xml.attribute("password", "");
xml.rightAngleBracket();
xml.halfOpenElement("event");
xml.attribute("node", "urn:xmpp:mucsub:nodes:messages");
xml.closeEmptyElement();
xml.halfOpenElement("event");
xml.attribute("node", "urn:xmpp:mucsub:nodes:affiliations");
xml.closeEmptyElement();
xml.halfOpenElement("event");
xml.attribute("node", "urn:xmpp:mucsub:nodes:subject");
xml.closeEmptyElement();
xml.halfOpenElement("event");
xml.attribute("node", "urn:xmpp:mucsub:nodes:config");
xml.closeEmptyElement();
xml.halfOpenElement("event");
xml.attribute("node", "urn:xmpp:mucsub:nodes:presence");
xml.closeEmptyElement();
xml.halfOpenElement("event");
xml.attribute("node", "urn:xmpp:mucsub:nodes:system");
xml.closeEmptyElement();
//xml.closeElement("subscribe");
csXMLString = xml.toString();
return xml;
}
};
iq.setFrom(AppConstants.csEJabberedId);
iq.setTo(chatRoom.getRoom());
iq.setStanzaId(StanzaIdUtil.newStanzaId());
iq.setType(IQ.Type.set);
String csStanzaXML = iq.toString();
connection.createStanzaCollectorAndSend(iq).nextResultOrThrow();
//sendStanza(iq);
}
catch (Exception ed)
{
ed.printStackTrace();
Logger.errorLog("Group Crate Exception Message = " + ed.getMessage());
}
//IQElement iqElement = new IQElement(AppConstants.appContact.csEJabberedId, chatRoom.getRoom(), "set", csSubId);
// iqElement.addCustomElement(subscribeElement);
//String responseString = iqElement.toXML().toString();
//chatRoom.sendMessage(responseString);
}
Я проверил некоторые ответы на SO, но все они для более старых версий или не актуальны.
Через Интернет некоторые темы, кажется, отвечают на это, как будто невозможно вернуться в старые комнаты, но в IOS это возможно. Я надеюсь, что для Android тоже будет такая же функция.
Благодарю.