aSmack - MultiUserChat.getJoinedRooms 返回空迭代器

Posted

技术标签:

【中文标题】aSmack - MultiUserChat.getJoinedRooms 返回空迭代器【英文标题】:aSmack - MultiUserChat.getJoinedRooms returns empty iterator 【发布时间】:2014-01-21 07:25:38 【问题描述】:

我正在开发一个 android 应用程序,该应用程序利用 ASmack 在后台服务中向服务器发送 XMPP 消息和从服务器发送 XMPP 消息。我可以通过拨打MultiUserChat.join(connection.getUser()); 加入MultiUserChat (MUC)。我可以通过调用 MultiUserChat.isJoined(); 来确认我加入了聊天,它返回 true。此外,由于我使用的是 www.hosted.im,因此我可以看到我在使用他们的在线 UI 的会议室。在另一个函数中,我尝试使用 MultiUserChat.getJoinedRooms(connection, connection.getUser()); 检索已加入房间的列表,但这会返回一个空迭代器。

private XMPPConnection connection;

/*... Connect to server and login with username and password ...*/

public Iterator<String> getJoinedRooms() 
    Log.i(ChatListActivity.TAG, "Trying to get joined rooms");
    Iterator<String> result = null;
    if(connection != null) 
        Log.i(ChatListActivity.TAG, "Returning joined chat rooms as " + connection.getUser());
        result = MultiUserChat.getJoinedRooms(connection, connection.getUser());
        while(result.hasNext()) 
           Log.w(ChatListActivity.TAG, result.next());
        
     else 
        Log.e(ChatListActivity.TAG, "Cannot get joined rooms.  Connection == NULL");
    

    if(result == null || (result != null && !result.hasNext())) 
        ArrayList<String> resultArr = new ArrayList<String>();
        resultArr.add(getString(R.string.no_chat_rooms_joined));
        result = resultArr.iterator();
        Log.i(ChatListActivity.TAG, "Returning EMPTY ITERATOR for joined chat rooms");
    
    return result;


public void joinRoom(String room) 
    if(connection != null) 
        Log.i(ChatListActivity.TAG, "Joining room " + room);
        // Create a MultiUserChat using a Connection for a room
        MultiUserChat muc2 = new MultiUserChat(connection, "testroom@conference.konstadtest.p1.im");

        try 
            muc2.join(connection.getUser());
            muc2.grantVoice(connection.getUser());
            muc2.grantMembership(connection.getUser());
            if(muc2.isJoined())
                Log.w(ChatListActivity.TAG, "Joined room " + room + " as " + connection.getUser());
            else
                Log.w(ChatListActivity.TAG, "Failed to join " + room + " as " + connection.getUser());
         catch (XMPPException e) 
            e.printStackTrace();
            Log.w(ChatListActivity.TAG, "Cannot join room " + room);
        
     else 
        Log.w(ChatListActivity.TAG, "Cannot join room " + room + " because connection is NULL");
    

我做错了什么?我打电话给SmackAndroid.init(getApplicationContext());,然后才打电话。

感谢您的帮助,

克里斯

【问题讨论】:

仅从您发布的代码很难判断出了什么问题。 aSmack 带有源代码,因此我建议您尝试调试问题。查看互换的 XMPP 节也可能提供提示。 好的。谢谢指点!我会检查这些。另外,感谢 aSmack 的工作! 【参考方案1】:

我所做的是在加入房间后添加了一个数据包侦听器。我也得到了一个空列表,但是当我调试时,我检查房间是否在服务器发送的结果 xml 节中返回因此我像这样手动添加 ha 数据包侦听器:

public void AddPacketListener()
    PacketFilter filter = new IQTypeFilter(IQ.Type.RESULT);
    MyService.getConnection().addPacketListener(new PacketListener() 
       
    public void processPacket(Packet paramPacket) 

    if(paramPacket.getFrom().equals(MyService.getConnection().getUser()))
            String xml=paramPacket.toXML();
            String from[];

            System.out.println(xml);
            from=paramPacket.getFrom().split("/");
                Pattern pattern = Pattern.compile("<item jid=\"(.*?)/>");
                Matcher matcher = pattern.matcher(xml);
                String parts[];

                Roomlist.clear();
                while (matcher.find())     

                    parts=matcher.group(1).split("@");
                    Roomlist.add(parts[0]);

                      
                return;         
                

    
    ,filter);


【讨论】:

嗨,目前我正在处理多用户聊天删除用户和删除组当管理员删除或删除组成员比所有组成员收到通知但删除的成员在 android 或服务器端没有收到通知时存在一些问题如何管理这个请解释如何在 android 中管理组离开、删除成员和删除组侦听器。我遵循 asmack 示例,只有一个 muc 或组对象侦听器工作。请帮忙 有两种类型的监听器。一个监听与其他成员相关的通知,另一个监听用户自己的通知。 addUserStatusListener(UserStatusListener listener) 监听用户自己的通知,即他何时被踢或禁止或何时获得任何类型的权限。另一个是 public void addParticipantListener(PacketListener listener),它监听对方的通知。如需更多帮助,请咨询。

以上是关于aSmack - MultiUserChat.getJoinedRooms 返回空迭代器的主要内容,如果未能解决你的问题,请参考以下文章

使用 asmack 设置头像

Asmack 为 Android 设置

Asmack/Openfire 401 错误

aSmack XMPP 文件传输循环处于“进行中”状态

在 ASmack 中创建组

ASmack - 从哪里获得 ChatManager?