MultipleChatUser XMPP asmack присоединиться

Я новичок в этом OpenFire и asmack, я хочу, чтобы у пользователя была функция многопользовательского чата, поэтому я поискал и нашел MUC. Я реализовал это для создания комнаты и отправки приглашений другим пользователям. эти работы, другой пользователь получает приглашение, но другой пользователь не может присоединиться к комнате.

Я делаю это при получении приглашения от другого пользователя

Здесь соединение — это соединение этого пользователя, а комната — это имя комнаты, которое мы получаем в приглашении.

MultiUserChat muc3 = новый MultiUserChat(подключение,комната);

muc3.join("testbot3");

testbot3 — просто случайное имя.

Но это выдает ошибку 404.

Нужно ли мне присоединяться к пользователю перед отправкой приглашения, т.е. если пользователь отправляет приглашение B, перед отправкой приглашения A должен присоединиться к этим пользователям по умолчанию в комнате, а затем это зависит от B, чтобы отклонить или просто молчать.

Что я делаю, так это то, что B получает приглашение от A в этом InvitationListner B, к которому я пытаюсь присоединиться с помощью приведенного выше кода.

Я уже давно пытаюсь, я не уверен, что происходит не так, кто-нибудь может дать пример кода, как это сделать, это было бы для меня большим подспорьем.

Спасибо

Вот дополнительная информация по моей проблеме

Когда я иду и проверяю Openfire, я вижу комнату, созданную пользователем, и он сам был добавлен в качестве владельца, поэтому я не думаю, что это будет проблемой с созданием комнаты.

Возможно, это может быть проблема с блокировкой комнаты, так как я прочитал, что комната заблокирована, когда комната не полностью создана, я думаю, это проблема с заполнением формы, когда мы создаем комнату, я не ввожу пароль в форму это может быть проблемой?

Пожалуйста, посмотрите следующий код ниже внутри обработчика, я вызываю метод «checkInvitation», который делает то же самое, что и приведенный выше код, но все же я получаю 404. Не могли бы вы сказать мне, что я не так в своем коде.

Может ли псевдоним, который необходимо добавить, быть любым или он должен быть чем-то специфичным для пользователя?

общественная пустота createChatroom () {

    MultiUserChat muc = null;

    try {
      muc = new MultiUserChat(connection, "[email protected]");
      muc.create("testbot");

      // Get the the room's configuration form
      Form form = muc.getConfigurationForm();
      // Create a new form to submit based on the original form
      Form submitForm = form.createAnswerForm();
      // Add default answers to the form to submit
      for (Iterator fields = form.getFields(); fields.hasNext();) {
          FormField field = (FormField) fields.next();
          if (!FormField.TYPE_HIDDEN.equals(field.getType()) && field.getVariable() != null) {
              // Sets the default value as the answer
              submitForm.setDefaultAnswer(field.getVariable());
          }
      }
      // Sets the new owner of the room
      List owners = new ArrayList();
      owners.add("admin@localhost");
      submitForm.setAnswer("muc#roomconfig_roomowners", owners);
      // Send the completed form (with default values) to the server to configure the room
      muc.sendConfigurationForm(submitForm);
      muc.join("d");

      muc.invite("b@localhost", "Meet me in this excellent room");

      muc.addInvitationRejectionListener(new InvitationRejectionListener() {
          public void invitationDeclined(String invitee, String reason) {
              // Do whatever you need here...
              System.out.println("Initee "+invitee+" reason"+reason);
          }
      });

    } catch (XMPPException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

    public void setConnection(XMPPConnection connection) {
    this.connection = connection;
    if (connection != null) {
        // Add a packet listener to get messages sent to us
        PacketFilter filter = new MessageTypeFilter(Message.Type.chat);
        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 + "]");
                    messages.add(fromName + ":");
                    messages.add(message.getBody());
                    // Add the incoming message to the list view
                    mHandler.post(new Runnable() {
                        public void run() {
                            setListAdapter();
                            checkInvitation();
                        }
                    });
                }
            }
        }, filter);


        mHandler.post(new Runnable() {
            public void run() {
                checkInvitation();
            }
        });
    }
}

person Doniv    schedule 23.01.2013    source источник
comment
Привет, @Doniv. Я смог отправлять сообщения пользователю в комнате, и метод processPacket вызывается каждый раз, когда я отправляю сообщение, но я не получаю никакого сообщения в методе processPacket. Есть ли проблема или нам нужно установить какие-либо другие слушатели? ??   -  person KK_07k11A0585    schedule 26.08.2013


Ответы (3)


Ошибка 404 указывает на то, что:

404 error can occur if the room does not exist or is locked

Итак, убедитесь, что ваша комната не заперта и не существовала! Код ниже показывает, как я присоединяюсь к комнате, когда есть входящее приглашение:

private void setChatRoomInvitationListener() {
    MultiUserChat.addInvitationListener(mXmppConnection,
            new InvitationListener() {

                @Override
                public void invitationReceived(Connection connection,
                        String room, String inviter, String reason,
                        String unKnown, Message message) {

                    //MultiUserChat.decline(mXmppConnection, room, inviter,
                        //  "Don't bother me right now");
                    // MultiUserChat.decline(mXmppConnection, room, inviter,
                    // "Don't bother me right now");
                    try {
                       muc.join("test-nick-name");
                       Log.e("abc","join room successfully");
                       muc.sendMessage("I joined this room!! Bravo!!");
                    } catch (XMPPException e) {
                       e.printStackTrace();
                       Log.e("abc","join room failed!");
                    }
                }
            });
}

Надеюсь, это поможет вашей ошибке!

Редактировать: вот как я настраиваю комнату:

 /*
         * Create room
         */
        muc.create(roomName);

        // muc.sendConfigurationForm(new Form(Form.TYPE_SUBMIT));
        Form form = muc.getConfigurationForm();
        Form submitForm = form.createAnswerForm();

        for (Iterator fields = form.getFields(); fields.hasNext();) {
            FormField field = (FormField) fields.next();
            if (!FormField.TYPE_HIDDEN.equals(field.getType())
                    && field.getVariable() != null) {
                show("field: " + field.getVariable());
                // Sets the default value as the answer
                submitForm.setDefaultAnswer(field.getVariable());
            }
        }

        List<String> owners = new ArrayList<String>();
        owners.add(DataConfig.USERNAME + "@" + DataConfig.SERVICE);
        submitForm.setAnswer("muc#roomconfig_roomowners", owners);
        submitForm.setAnswer("muc#roomconfig_roomname", roomName);
        submitForm.setAnswer("muc#roomconfig_persistentroom", true);

        muc.sendConfigurationForm(submitForm);
        // submitForm.
        show("created room!");
        muc.addMessageListener(new PacketListener() {
            @Override
            public void processPacket(Packet packet) {
                show(packet.toXML());
                Message mess = (Message) packet;
                showMessageToUI(mess.getFrom() + ": " + mess.getBody());
            }
        });

С этой конфигурацией я могу легко присоединиться к комнате без пароля.

person Kingfisher Phuoc    schedule 23.01.2013
comment
Когда я иду и проверяю Openfire, я вижу комнату, созданную пользователем, и он сам был добавлен в качестве владельца, поэтому я не думаю, что это будет проблемой при создании. - person Doniv; 23.01.2013
comment
Вы когда-нибудь пытались присоединиться к комнате с учетной записью пользователя, которая не является владельцем комнаты? - person Kingfisher Phuoc; 23.01.2013
comment
Привет @Kingfisher. Мне удалось отправить сообщения пользователю в комнате, и метод processPacket вызывается каждый раз, когда я отправляю сообщение, но я не получаю никакого сообщения в методе processPacket. Есть ли проблема или нам нужно установить какие-либо другие слушатели? ?? - person KK_07k11A0585; 26.08.2013
comment
@ KK_07k11A0585 Я думаю, что вам следует зарегистрировать прослушиватель в вашем объекте XmppConnection: xmppConnection.addPacketListener(packetListener, null);, а в packetListener вы можете проверить тип полученного пакета, например: if (packet instanceof org.jivesoftware.smack.packet.Message && ((org.jivesoftware.smack.packet.Message) packet) .getType().equals(Type.groupchat)) . Не регистрируйтесь в MUC, просто зарегистрируйтесь в connection. - person Kingfisher Phuoc; 26.08.2013
comment
У меня есть одно сомнение! После присоединения к комнате без указания DiscussionHistory, то есть с помощью метода muc.join(nickName); я получаю историю чата в processPacket() метод. Но я обнаружил, что он не дает все сообщения в групповом чате, мне нужна история обсуждений с самого первого сообщения в чате до последнего сообщения. Есть ли способ добиться этого ?? - person KK_07k11A0585; 27.08.2013
comment
@ KK_07k11A0585: Вам следует внимательно прочитать эту ссылку: xmpp.org/extensions/ xep-0045.html#registrar-formtype-owner. При настройке комнаты есть поле: ` ‹field var='muc#maxhistoryfetch' type='text-single' label='Максимальное количество сообщений истории, возвращенных комнатой'/›`. Вы должны настроить его, чтобы получать все сообщения истории! P/s: в следующий раз, пожалуйста, задайте другой вопрос! - person Kingfisher Phuoc; 27.08.2013
comment
Большое спасибо .. вы действительно спасли мой день .. Это работает для создания постоянной чат-комнаты - person Nirav Dangi; 28.08.2014
comment
@Kingfisher, не могли бы вы сообщить мне в своем входящем коде приглашения muc.join(test-nick-name);откуда вы берете объект muc?? - person Dev; 05.09.2014
comment
Хорошо, я понял, мне нужно добавить MultiUserChat muc=new MultiUserChat(соединение, комната) в приглашенииReceived(Соединение соединения,Комната строки,Пригласитель строки,Причина строки,Неизвестная строка,Сообщение), чтобы получить объект muc,спасибо за код !!! - person Dev; 06.09.2014

Вы можете использовать фрагмент кода, чтобы присоединиться к чату:

public void joinMultiUserChatRoom(String userName, String roomName) {
        // Get the MultiUserChatManager
        MultiUserChatManager manager = MultiUserChatManager.getInstanceFor(connection);

        // Create a MultiUserChat using an XMPPConnection for a room
        MultiUserChat multiUserChat = manager.getMultiUserChat(roomName + "@conference.localhost");

        DiscussionHistory history = new DiscussionHistory();
        history.setMaxStanzas(-1);
        try {
            multiUserChat.join(userName, "", history, connection.getPacketReplyTimeout());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
person Kevin Chen    schedule 27.06.2018

Пригласить друга:

 /**
     * Invites another user to this room.
     *
     * @param userAddress the address of the user to invite to the room.(one
     *   may also invite users not on their contact list).
     * @param reason a reason, subject, or welcome message that would tell
     *   the the user why they are being invited.
     */
    public void invite(String userAddress, String reason)
    {
        multiUserChat.invite(userAddress, reason);
    }
person Z. Mei    schedule 29.06.2018