MultiUserChatManager mucManager = MultiUserChatManager.getInstanceFor(conn);
MultiUserChat muc = mucManager.getMultiUserChat("meet_alice@conference.buddyme.com");
newMsg = muc.createMessage();
newMsg.setBody(strMsg);
newMsg.setType(Message.Type.groupchat);
我的要求是在
中传递自定义消息类型newMsg.setType(Message.Type.groupchat);
例如,我没有传递"Message.Type.groupchat"
而是传递"Message.Type.image"
或某些字符串“image”,默认情况下不存在于类型中。
答案 0 :(得分:3)
设置不同的消息类型,然后不允许XMPP RFC中定义的消息类型,因为它会产生无效的消息节。请使用添加到消息节的自定义扩展元素。
而不是
<message type='my-custom-message-type-news' …>
<body>
This is a message with a custom message type 'news'.
Do not do this!
</body>
</message>
DO
<message …>
<body>
This is a message with additional metadata found in a custom
extension element. In this example the message is tagged as 'news'.
That is how you extend XMPP and tag messages.
</body>
<my-custom-extension-element xmlns='https://my.company.com' type='news'>
<more-metadata-if-you-want date='2018-04-03'/>
</my-custom-extension-element>
</message>
答案 1 :(得分:0)
您可以通过修改 org.jivesoftware.smack.packet 中的消息类来添加自定义类型
Enum中的定义了您的自定义类型
public enum Type {
/* CUSTOM TYPE */
image
/**
* (Default) a normal text message used in email like interface.
*/
normal,
/**
* Typically short text message used in line-by-line chat interfaces.
*/
chat,
/**
* Chat message sent to a groupchat server for group chats.
*/
groupchat,
/**
* Text message to be displayed in scrolling marquee displays.
*/
headline,
/**
* indicates a messaging error.
*/
error;
/**
* Converts a String into the corresponding types. Valid String values that can be converted
* to types are: "normal", "chat", "groupchat", "headline" and "error".
*
* @param string the String value to covert.
* @return the corresponding Type.
* @throws IllegalArgumentException when not able to parse the string parameter
* @throws NullPointerException if the string is null
*/
public static Type fromString(String string) {
return Type.valueOf(string.toLowerCase(Locale.US));
}
}
对于发送消息,您只需按照以下方式设置自定义类型(图片):
Message message = new Message();
message.setType(Message.Type.image);
message.setStanzaId("123");
message.setTo(number);
try {
connection.sendStanza(message);
} catch (NotConnectedException e) {
}
和自定义类型的接收消息使用以下代码
StanzaTypeFilter message_filter = new StanzaTypeFilter(Message.class);
connection.addSyncStanzaListener(new StanzaListener() {
@Override
public void processPacket(Stanza packet) throws NotConnectedException {
Message message = (Message)packet;
if(message.getType() == Message.Type.image) {
//your code
}
}
}, message_filter);
<强> ________________________________________________________________ 强>
编辑:您需要将源代码文件添加到您的项目中(不需要重新编写JAR文件)
<强> ________________________________________________________________ 强>
我在我的项目中使用Smack 4.1.2。您可以从以下链接下载 https://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_4_1_2.zip
解压缩,在libs文件夹中每个模块有3个jar文件 例如
您只需要简单的jar文件,在项目lib文件夹中添加所需的jar文件。例如,我正在使用以下罐子,下面是我的 app.gradle
compile files('libs/smack-core-4.1.2-sources.jar')
compile files('libs/smack-android-4.1.2.jar')
compile files('libs/smack-extensions-4.1.2.jar')
compile files('libs/smack-im-4.1.2.jar')
compile files('libs/smack-sasl-provided-4.1.2.jar')
compile files('libs/smack-tcp-4.1.2.jar')
现在,为了自定义Smack(即添加自定义类型),您需要将代码添加到项目中
解压缩 smack-core-4.1.2- 来源 .jar 并将java代码文件添加到您的项目中,现在您可以编辑 Message.java 强>