如何使用 smack-android:4.1.4 在多用户聊天室中解禁用户

Posted

技术标签:

【中文标题】如何使用 smack-android:4.1.4 在多用户聊天室中解禁用户【英文标题】:How to unban user in multi user chat room using smack-android:4.1.4 【发布时间】:2015-12-22 23:11:49 【问题描述】:

我正在使用 smack-android:4.1.4 连接到 xmpp 服务器,并使用此代码连接到该服务器上的多用户聊天室:

MultiUserChatManager mucManager = MultiUserChatManager.getInstanceFor(connection);
MultiUserChat muc = mucManager.getMultiUserChat(roomName);
muc.join(nickName,password,discussionHistory,timeout);

如果我是这个房间的所有者,那么我可以踢或禁止用户,以禁止用户:

muc.banUser(userJID, reason);

我可以得到这个房间的被禁用户列表:

List<Affiliate> bannedList = muc.getOutcasts();

问题 1:如何从之前的列表中取消对用户的禁令? 问题是我找不到类似的功能:

//muc.unbanUser(String userJID);    // there's nothing close to this

我阅读了整个文档但一无所获,那么我在这里遗漏了什么?

我可以通过弃子列表获取任何被封禁用户的jid:

String jid = outcast.getJid();  // where outcast is of type Affiliate

但是没有使用这个jid解封用户的功能。

问题 2:此问题与房间有关,但与禁止列表问题无关,在某些房间我得到以下异常:

PacketParserUtils? Failed to parse extension packet in Presence packet. Attributes: from=roomName@conference.myXmppServer/someUserNickName id=null
org.jivesoftware.smack.SmackException: Caps elment with missing attributes. Attributes: hash=null version=1.0.0.84 node=http://www.google.com/xmpp/client/caps
        at org.jivesoftware.smackx.caps.provider.CapsExtensionProvider.parse(CapsExtensionProvider.java:54)
        at org.jivesoftware.smackx.caps.provider.CapsExtensionProvider.parse(CapsExtensionProvider.java:28)
        at org.jivesoftware.smack.provider.Provider.parse(Provider.java:35)
        at org.jivesoftware.smack.util.PacketParserUtils.parseExtensionElement(PacketParserUtils.java:929)
        at org.jivesoftware.smack.util.PacketParserUtils.addExtensionElement(PacketParserUtils.java:1060)
        at org.jivesoftware.smack.util.PacketParserUtils.parsePresence(PacketParserUtils.java:583)
        at org.jivesoftware.smack.util.PacketParserUtils.parseStanza(PacketParserUtils.java:155)
        at org.jivesoftware.smack.AbstractXMPPConnection.parseAndProcessStanza(AbstractXMPPConnection.java:956)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$500(XMPPTCPConnection.java:140)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:989)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:944)
        at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:959)
        at java.lang.Thread.run(Thread.java:856)

它指的是 smack 库类中的一些代码,所以它不是我的代码中的一些未捕获的异常,

这个异常的原因是什么?没有办法处理这种未解析的数据吗?

我在我的应用程序的其他部分使用 ParsingExceptionCallback:

connection.setParsingExceptionCallback( parsingExceptionCallback ); 

但是这种情况下没有调用这个函数,MultiUserChat类有没有类似的函数?

【问题讨论】:

问这些问题的最佳地点是 Smack For Android 论坛(嗯……如果有的话)。 【参考方案1】:

也许让用户成为会员会从禁止列表中删除 jid?因为根据 xmpp,一个 jid 不能出现在多个列表中...... xmpp 中有五个列表,一个用于所有者、管理员、成员,没有和禁止。

在以下网站

http://xmpp.org/extensions/xep-0045.html

阅读

4.1 一般条款

5.2.1 权限

可选读

    管理用例

【讨论】:

是的,你是对的,这就是我所做的,但不能强迫管理员将被禁止的用户设为会员以将他从弃儿列表中删除,而是应该有一种使被禁止用户成为“无”用户的方法。我的解决方案是让被禁止的用户成为会员,然后撤销他/她的会员资格,这样他的从属关系变为“无”并且他不再被禁止。无论如何感谢您的回答:)【参考方案2】:

我正在使用带有 smack-android-4.1.9 库的 ejabberd 服务器,下面的代码非常适合我。

 //remove the user from Group of ejabberd.
//revoke the Ownership,Admin and membership from group of ejabberd.
public void removeUser(String room_jid,RosterVO removeUserRosterVo,boolean isAdmin)
    MultiUserChatManager multichatmanager = MultiUserChatManager.getInstanceFor(connection);
    MultiUserChat chatRoom = multichatmanager.getMultiUserChat(room_jid);

    try 
        if (isAdmin) 
            chatRoom.revokeOwnership(removeUserRosterVo.getJid());
            chatRoom.revokeAdmin(removeUserRosterVo.getJid());
            chatRoom.revokeMembership(removeUserRosterVo.getJid());
         else 
            chatRoom.revokeMembership(removeUserRosterVo.getJid());
        
     catch (SmackException.NotConnectedException e) 
        e.printStackTrace();
     catch (XMPPException.XMPPErrorException e) 
        e.printStackTrace();
     catch (SmackException.NoResponseException e) 
        e.printStackTrace();
    


【讨论】:

以上是关于如何使用 smack-android:4.1.4 在多用户聊天室中解禁用户的主要内容,如果未能解决你的问题,请参考以下文章

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?