MultiUserChat发送和接收消息错误

问题描述 投票:0回答:2

我正在开发android聊天应用程序(xmpp服务器-prosody-和android smack库)我成功创建了组会议室并邀请成员但是当我尝试向组发送消息时,此节出现错误:

<message to='[email protected]/Roo' from='[email protected]' id='123' type='error'><error type='cancel'><not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></message>

我发送消息的代码:

    MultiUserChat muc = manager.getMultiUserChat(roomBarJid);



    Message msg = new Message(roomBarJid);

    msg.setType(Message.Type.groupchat);
    msg.setBody("Hi there");
    msg.setStanzaId("123");
    msg.setSubject("Rokayah ..... ");
    msg.setTo(roomBarJid);

    try {
      if (muc != null) {
          muc.sendMessage(msg);
      }       Log.d("GROUP", "The message send..............");
    } catch (SmackException.NotConnectedException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

这是接收消息的监听器:

    StanzaFilter filter = new StanzaTypeFilter(Message.class);
    mConnection.addSyncStanzaListener(new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {

       Message message = (Message) packet;
       String body = message.getBody();

       Log.d("GROUP" , "here :" +body);



        }
    }, filter);

我不知道发送和接收监听器有什么问题给我空消息体。

任何帮助请!!

android xmpp chat smack
2个回答
1
投票

在发送XMPP消息之前,您必须先加入房间。

要加入xmpp房间,你必须发送一个存在节,如下所示:

<presence
    from='[email protected]/pda'
    id='n13mt3l'
    to='[email protected]/thirdwitch'>
  <x xmlns='http://jabber.org/protocol/muc'/>
</presence>

在java中,这将是:

Presence joinPresence = new Presence(Presence.Type.available);
joinPresence.setTo(mThreadId);
joinPresence.addExtension(new MUCInitialPresence());

XMPPConnection conx = Application.getInstance().getXMPPConection();
PacketFilter responseFilter = new AndFilter(new FromMatchesFilter(mThreadId), new PacketTypeFilter(Presence.class));

PacketCollector response = conx.createPacketCollector(responseFilter);
conx.sendPacket(joinPresence);

Presence presence = (Presence) response.nextResult(SmackConfiguration.getPacketReplyTimeout());
response.cancel();

if (presence == null) {
    Log.e("XMPP", "No response from server.");
} else if (presence.getError() != null) {
    Log.e("XMPP", presence.getError().toString());
}

0
投票

首先,您需要加入一个房间,并确保其他组用户也加入该组,因为您必须发送如下所示的组加入邀请。

public static void inviteToGroup(String inviteuser, String groupName) {

    if (TextUtils.isEmpty(inviteuser) || TextUtils.isEmpty(groupName)) return;

    try {

        EntityBareJid mucJid = JidCreate.entityBareFrom(groupName + "@" + Constants.GRP_SERVICE);

        Resourcepart nickname = Resourcepart.from(userId);

        mucChatManager = MultiUserChatManager.getInstanceFor(MyApplication.connection);
        mucChat = mucChatManager.getMultiUserChat(mucJid);
        Message message = new Message();
        // message.setType(Type.normal);
        message.setSubject(Constants.GROUP_CHAT_MSG_MODE);
        message.setBody(Constants.GROUP_GREETINGS);
        EntityBareJid eJId = JidCreate.entityBareFrom(inviteuser + "@" + Constants.XMPP_DOMAIN);



        /*MucEnterConfiguration.Builder mucEnterConfiguration
                = mucChat.getEnterConfigurationBuilder(nickname).requestHistorySince(sinceDate);*/

        MucEnterConfiguration.Builder mucEnterConfiguration
                = mucChat.getEnterConfigurationBuilder(nickname).requestNoHistory();

        mucChat.join(mucEnterConfiguration.build());

        LogM.e("Room joined");

        //  mucChat.invite(message, eJId, groupName);

    } catch (XmppStringprepException e) {
        e.printStackTrace();
    } catch (SmackException.NotConnectedException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (SmackException.NoResponseException e) {
        e.printStackTrace();
    } catch (XMPPException.XMPPErrorException e) {
        e.printStackTrace();
    } catch (MultiUserChatException.NotAMucServiceException e) {
        e.printStackTrace();
    }



}

这是我发送组消息的代码,您需要添加消息类型为Type.groupchat

public boolean sendGrpMessage(ChatPojo chatPojo, String grp_name) {
    try {

        final String body = gson.toJson(chatPojo);

        Message msg = new Message();
        msg.setType(Type.groupchat);
        msg.setSubject("chat");
        msg.setBody(body);

        EntityBareJid mucJid = JidCreate.entityBareFrom(grp_name + "@" + Constants.GRP_SERVICE);
        mucChatManager = MultiUserChatManager.getInstanceFor(MyApplication.connection);
        mucChat = mucChatManager.getMultiUserChat(mucJid);

        mucChat.sendMessage(msg);
        //DataManager.getInstance().updateReceiptReceived(msgReceipt,Constants.MESSAGE_STATUS_NOT_DELIVERED);
        return true;

    } catch (XmppStringprepException | InterruptedException | SmackException.NotConnectedException e) {
        Log.d(TAG, "sendGrpMessage() Error = [" + e.getMessage() + "]");
        return false;
    }

}

之后添加组消息监听器

StanzaFilter filter = MessageTypeFilter.GROUPCHAT;
    MyApplication.connection.addAsyncStanzaListener(new StanzaListener() {
        @Override
        public void processStanza(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {



            Message message = (Message) packet;

            if (message.getType() == Type.groupchat && message.getBody() != null) {

                LogM.e("+++++++++++++++++++++++++++GROUPCHAT+++++++++++++++++++++++++++++++++");
                LogM.e("from: " + message.getFrom());
                LogM.e("xml: " + message.getType().toString());
                LogM.e("Got text [" + message.getBody() + "] from [" + message.getFrom() + "]");


                LogM.e("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");


                } else if (message.getType() == Type.error) {

                Toast.makeText(service, "error type", Toast.LENGTH_SHORT).show();

            }  


        }
    }, filter);
© www.soinside.com 2019 - 2024. All rights reserved.