I am develop android chat app (xmpp server -prosody- and android smack library)
I created group room successfully and invite members but when I try to send message to the group this stanza error appears :
<message to='rokayah89@eonaws.com/Roo' from='room31@conference.eonaws.com' id='123' type='error'><error type='cancel'><not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/></error></message>
my code for send 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();
}
and this is listener for receive message:
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);
I don't know what is wrong with send and receive the listener give me null message body.
Any Help pls!!
you have to first join the room before sending the XMPP message.
to join the xmpp room you have to send a presence stanza that will be like this:
<presence
from='hag66@shakespeare.lit/pda'
id='n13mt3l'
to='coven@chat.shakespeare.lit/thirdwitch'>
<x xmlns='http://jabber.org/protocol/muc'/>
</presence>
In java this will be like:
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());
}
First of all, you need to join a room and make sure other group users also join the group as well, for that you have to send a group join invitation like below.
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();
}
}
Here is my code for send Group Message you need to add message Type as a 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;
}
}
after that add group message listener
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);