如何在Smack中设置自定义XMPP Message.Type字符串?

时间:2015-05-06 16:50:21

标签: xmpp smack

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”,默认情况下不存在于类型中。

2 个答案:

答案 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文件 例如

  1. 咂嘴-机器人-4.1.2.jar
  2. 咂嘴-机器人-4.1.2-javadoc.jar
  3. 咂嘴-机器人-4.1.2-sources.jar
  4. 您只需要简单的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