【问题标题】:Not Recieving Messages for MultiUser Chat Xmpp samck android不接收多用户聊天 Xmpp smack android 的消息
【发布时间】:2017-02-20 16:00:12
【问题描述】:

我正在开发一个聊天应用程序,我可以在其中发送消息、图像、视频等 我已经在一对一的聊天中做到了这一点,也在群聊中实现了这一点。 但问题是:- 每次登录时,我都必须始终加入每个组,否则我无法收到来自不同组的消息。

这是我每次加入群组的方式。

  MultiUserChat muc= new  MultiUserChat(mConnection,"hsjsmqb@conference.11.111.111.111");
    String userNAme ="222222222";
muc.join(userNAme);

如果我每次没有收到消息时都没有加入群组。 如果我加入群组,我就会开始接收消息。

我的问题是这是唯一的解决方案还是所有群聊都以这种方式工作。 还是我做错了什么
我用谷歌搜索但没有找到任何解决方案。 如果是重复的问题或与我的问题相关的任何答案,请分享链接 谢谢

这是代码:-

public boolean createChatRoom() {
        String name = edtGroupName.getText().toString();
        if (!(connection.isConnected() && name.length() != 0)) {
            return false;
        }
        try {
            // Create a MultiUserChat

            String userName = Utils.covertIntoSubString(connection.getUser(), Constant.AT);
            roomName = (name + md5String(getDateTime()) + userName + Constant.CONFERENCE + connection.getServiceName()).replaceAll(" ", "");
            MultiUserChat muc = new MultiUserChat(connection, roomName);

            // Create a chat room
            muc.create(roomName);
            // set Room Name as room subject
            muc.changeSubject(name);// RoomName room name


            // To obtain the chat room configuration form
            Form form = muc.getConfigurationForm();
            // Create a new form to submit the original form according to the.
            Form submitForm = form.createAnswerForm();
            // To submit the form to add a default reply
            for (Iterator<FormField> fields = form.getFields(); fields
                    .hasNext(); ) {
                FormField field = (FormField) fields.next();
                if (!FormField.TYPE_HIDDEN.equals(field.getType())
                        && field.getVariable() != null) {
                    // Set default values for an answer
                    submitForm.setDefaultAnswer(field.getVariable());
                }
            }

            // Set the chat room of the new owner
            List<String> owners = new ArrayList<String>();
            owners.add(connection.getUser());// The user JID
//            submitForm.setAnswer("muc#roomconfig_roomowners", owners);
            // Set the chat room is a long chat room, soon to be preserved
            submitForm.setAnswer("muc#roomconfig_persistentroom", true);
            // chat room is public
            submitForm.setAnswer("muc#roomconfig_publicroom", true);
            // Allows the user to modify the nickname
            submitForm.setAnswer("x-muc#roomconfig_canchangenick", true);
            // Allows the possessor to invite others
//            submitForm.setAnswer("muc#roomconfig_allowinvites", true);

//            submitForm.setAnswer("muc#roomconfig_enablelogging", true);
            // Only allow registered nickname log
//            submitForm.setAnswer("x-muc#roomconfig_reservednick", true);

            // Allows the user to register the room
//            submitForm.setAnswer("x-muc#roomconfig_registration", true);

            muc.sendConfigurationForm(submitForm);

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }
public void inviteFriends(String userJid) {
    try {
        String groupName = edtGroupName.getText().toString();
        Message msg = new Message();
        msg.setBody(groupName);
        MultiUserChat muc = new MultiUserChat(connection, roomName);
        if (muc != null) {
            muc.grantMembership(userJid);
            muc.invite(msg, userJid, groupName);
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

public void invitationrecvd(){
MultiUserChat chatRoom = new MultiUserChat(con, rum);
                    try {
                        chatRoom.join(userName);
                        saveGroupsToDb(userName + Constant.AT + Constant.HOST + Constant.SLASHSMACK, rum, group);

                    } catch (Exception e) {
                        e.printStackTrace();
                    }

}

这是主屏幕上的组消息监听器

PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
        groupMessagesListeners = new GroupMessagesListeners();
        mConnection.addPacketListener(groupMessagesListeners,filter);

【问题讨论】:

    标签: android xmpp smack multiuserchat


    【解决方案1】:

    群聊的地址是 XMPP muc(多用户聊天),因此您需要加入 muc 才能接收在该特定群组中发送的消息。您可以在https://xmpp.org/extensions/xep-0045.html 中阅读更多相关信息。

    以下是链接的摘录:

    7.2.1 群聊 1.0 协议

    为了参与多用户聊天中的讨论 房间,用户必须首先通过进入房间成为居住者。在 旧的群聊 1.0 协议,这是通过发送出席信息来完成的 没有“类型”属性,其中“房间”是房间 ID,“service”是聊天服务的主机名,“nick”是 用户在房间内想要的昵称:

    【讨论】:

    • 问题是我必须重新加入已经加入的组才能接收消息...否则我无法接收针对我是成员的组的消息...
    • 加入后是否退出群?可能每 10 秒左右发送一次状态,以便您仍然是房间的一部分
    • 不,我不离开小组,我是小组的一员,但不接收消息...我不知道出了什么问题...
    • 发布日志。如果您加入 muc 并且不离开,您将收到 muc 消息。因此,服务器或您的代码或您正在使用的 xmpp 库有问题。一个简单的检查是确定当其他参与者加入 muc 时您是否在场。
    • 所以你的意思是我们只需要加入一个组而不是每次。对吗..
    【解决方案2】:

    我或多或少已经回答了这种答案,但你的代码更干净(Can't able to receive group chat messages using smack-android:4.1.4)。

    1) 当您创建多用户聊天时,要完成它,您必须加入此聊天或它刚刚配置但尚未激活的房间。

    muc.sendConfigurationForm(submitForm);
    muc.join("My Nickname","password"); //omit password if not needed
    

    2) 要自动加入您的群聊,您可以使用 PubSub 功能 带有 Smack 的 sn-p 可以如下所示:

    BookmarkManager bookmarkManager = BookmarkManager.getBookmarkManager(mConnection);
    bookmarkManager.addBookmarkedConference
            ("My roomname label",
            roomName,
            true,
            "My Nickname",
            password);
    

    在以下情况下添加此代码:

    • 你创建了一个群聊
    • 您接受了群聊的邀请。

    (要删除书签,只需:

    this.bookmarkManager.removeBookmarkedConference(roomName)
    

    )

    最后,登录后,添加自动加入群聊的方法:

    List<BookmarkedConference> list = BookmarkManager.getBookmarkManager(mConnection).getBookmarkedConferences();
    
            MultiUserChat muc;
            for (BookmarkedConference conference : list)
            {
                System.out.println("- Conference with bookmark: " + conference.getName() +
                        " and jid: " + conference.getJid());
    
    
                if ( (muc = multiUserChatManager.getMultiUserChat(conference.getJid()) )  != null
                && conference.isAutoJoin())
                    {
    
                        muc.join("My Nickname");
                            //foo
        }
    }
    

    在此之后,您可以配置和管理您的群聊。就个人而言,我不喜欢在mConnection 中添加一个通用的PacketListener,因为这会导致与前端同步接收到的消息很困难,但这最终将成为另一个分支。

    【讨论】:

    • 感谢朋友详细研究代码。但是您分享的内容是始终加入我们创建的房间......我的问题是有什么方法我们不需要每次我们已经是会员时加入房间。或者它是唯一的解决方案.???谢谢@MrPk
    • 唯一的解决方案。成为会员(所有者,管理员,会员,弃儿)只是赋予您做某事的权利(例如更改主题等),但理论上可以将管理员用户添加为默认所有者,当然他不需要接收任何消息。基本上你会收到从 Time TJ (join) 到 Time TL (left) 的消息,其他配置只是配置。
    • 所以我的理解是每次启动应用程序时我都必须加入所有组。所以在那之后,我开始从加入和离开时收到针对群组的消息。
    • 完全是@AliAbhas(添加并编辑:通过 Presence 可以设置“请勿打扰”等状态并在您加入聊天时中断接收消息)
    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    • 2016-02-06
    • 2017-04-04
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多