Как получить имя отправителя или его JID в сообщении многопользовательского чата с помощью Smack?

я работаю над чат-приложением на основе XMPP в Android.

Я сделал чат один на один, но возникли проблемы с многопользовательским чатом. Я успешно создал новую комнату чата, к ней могут присоединиться несколько пользователей. я также написал код для addPacketListener для группового чата с PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);

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

например, пакет сообщения чата один на один имеет функцию message.getFrom() для получения JID отправителя.

в случае многопользовательского чата та же функция возвращает JID группы/комнаты в качестве отправителя.

я также пытался установить свойство сообщения при отправке message.setFrom(senderJID); или message.setFrom([email protected]/Groupname);

до сих пор я не могу получить senderJID или его псевдоним.

поэтому мой вопрос: как получить JID пользователя-отправителя или его псевдоним? из сообщения (пакета) в messageListener

Код для отправки сообщения в группе: -

String to = strGroupJID;
String text = etChatOnTextBox.getText().toString();
if(!text.equals(""))
{
        Message msg = new Message(to, Message.Type.groupchat);
        msg.setBody(text);
        String name1 = xmppConnection.getUser();
        name1 = name1.substring(0, name1.lastIndexOf("@"));
        name1 = name1 + "@conference.192.168.56.1";
       // name1 = name1 + "@conference.192.168.56.1/" + strGroupName ;
        msg.setFrom(name1);
        muc.sendMessage(msg);
 }

Код для получения сообщения: -

PacketFilter filter = new MessageTypeFilter(Message.Type.groupchat);
        connection.addPacketListener(new PacketListener() {
            @Override
            public void processPacket(Packet packet) {
                Message message = (Message) packet;
                if (message.getBody() != null) {
                    String fromName = StringUtils.parseBareAddress(message
                            .getFrom());

                    Log.i("ChatOn", "Text Recieved " + message.getBody()
                            + " from " + fromName );
           }
        }
   });

любая помощь или предложение приветствуется, спасибо


person Yograj Shinde    schedule 14.08.2014    source источник


Ответы (2)


Этот фрагмент вашего кода идентифицирует комнату чата:

String fromName = StringUtils.parseBareAddress(message
        .getFrom());

Вы можете использовать этот код для определения ника пользователя чата:

String nick = StringUtils.parseResource(message
        .getFrom());

Это связано с тем, что JID сообщений многопользовательского чата выглядят как roomname@server/nickname, а псевдоним пользователя является ресурсом JID.

person legoscia    schedule 14.08.2014
comment
привет, я напечатал значение этой переменной, и оно возвращает меня как [email protected] welcome — это имя моей группы/комнаты, и оно не возвращает мне никнейм пользователя, отправившего это сообщение - person Yograj Shinde; 14.08.2014
comment
Какая переменная? fromName или nick? - person legoscia; 14.08.2014
comment
извините, это была переменная fromName. я получаю ник в переменной ник. спасибо, могу я задать еще одно сомнение, у меня это не связано с этим вопросом, а связано с многопользовательским чатом? - person Yograj Shinde; 14.08.2014
comment
Лучше опубликовать это как отдельный вопрос, чтобы больше людей могли его посмотреть. - person legoscia; 14.08.2014

Как получить JID пользователя-отправителя или его никнейм? из сообщения (пакета) в messageListener

Если вы посмотрите на XEP-45 7.4, вы увидите, что JID from — это чистый JID MUC плюс псевдоним члена MUC в качестве ресурса. Так что никнейм — это ресурс из JID.

Если комната не является анонимной, вы можете получить полный JID посетителя в расширенной информации о присутствии (XEP-45 7.2.4)

person Flow    schedule 14.08.2014
comment
когда я получаю сообщение в своем коде прослушивателя, он просто возвращает JID комнаты в качестве отправителя. поэтому я не могу различить, кто является отправителем сообщения в группе. - person Yograj Shinde; 14.08.2014
comment
Включите отладку Smack и покажите полную строфу, которую вы получаете. - person Flow; 14.08.2014