【问题标题】:How can I add custom attribute (nick) in my XMPP message tag, in Smack 4.1如何在 Smack 4.1 中的 XMPP 消息标签中添加自定义属性(昵称)
【发布时间】:2015-05-11 06:42:36
【问题描述】:

我想在我的 XMPP 聊天消息中添加 自定义属性(昵称),如下例所示

<message from='*' to='*' id='123' nick='KASHIF' type='chat'><body>hello</body></message>

我知道,XMPP 不推荐,但这是我的要求,因为这个 attribute(nick) 已经在我正在使用的应用程序的 iOS 版本中实现开。

【问题讨论】:

    标签: android xmpp smack


    【解决方案1】:

    不要这样做,不推荐这样做是有原因的。有些服务器很可能会剥离该属性,甚至完全拒绝处理数据包。相反,推荐的方法是添加自定义元素。

    其实这样的扩展已经存在了,XEP-0172:

    <message from='*' to='*' id='123' type='chat'>
        <nick xmlns='http://jabber.org/protocol/nick'>KASHIF</nick>
        <body>hello</body>
    </message>
    

    这可能已经适用于其他客户端或库,因此它是一个更好的解决方案。

    【讨论】:

    • 在我的情况下,这会导致应用程序的 iOS 版本崩溃
    【解决方案2】:

    为此,您需要编辑 2 类 Smack 4.1

    • (org.jivesoftware.smack.packet)中的Stanza
    • (org.jivesoftware.smack.util) 中的 PacketParserUtils

    1.节类

    定义您的自定义属性(nick

     private String nick = null;
    

    定义 Getter 和 Setter

    public String getNick() {
        return this.nick;
    }
    
    public void setNick(String paramString) {
       this.nick = paramString;
    }
    

    编辑节构造函数

    protected Stanza(Stanza p) {
    
       //add this line
       nick = p.getNick();
    
    }
    

    编辑addCommonAttributes方法

    protected void addCommonAttributes(XmlStringBuilder xml) {
    
        //add this line
        if(getNick()!= null)
             xml.optAttribute("nick", getNick());
    }
    

    2. PacketParserUtils 类

    编辑parseMessage方法

     public static Message parseMessage(XmlPullParser parser)
                    throws XmlPullParserException, IOException, SmackException {
    
       //add this line
       message.setNick(parser.getAttributeValue("", "nick"));
    
    }
    

    现在您可以简单地设置昵称并发送消息,如下所示

    Message message = new Message();
    message.setType(Message.Type.chat);
    message.setStanzaId("123");
    message.setTo(number);
    
    message.setNick("SHAYAN");    
    
    try {
     connection.sendStanza(message);
    } catch (NotConnectedException e) {
    }
    

    【讨论】:

    • 嗨 shanrais!,我从 github 克隆了 Smack,并编辑了两个类。但是,你没有说如何将 smack 和创建 jars 再次部署到 Android 对吗?
    • 我没有创建罐子,而是包含了我在项目中编辑的那个罐子的源代码。
    • 你能说哪些文件夹需要复制吗?在github上的项目github.com/igniterealtime/Smack中有很多文件夹,我不知道哪些文件夹需要复制到我的项目中。以下 jar 在我的应用程序 gradle 中声明: compile 'org.igniterealtime.smack:smack-android-extensions:4.1.1' compile 'org.igniterealtime.smack:smack-experimental:4.1.1' compile 'org.igniterealtime.smack: smack-tcp:4.1.1'
    • 不要将 smack-core-4.1.0.jar 复制到您的 lib 文件夹中。只需将 smack-core-4.1.0-sources 的代码复制到您的项目中即可。
    • 你能举例项目吗?我只添加了源代码 smack-core-4.1.0-sources 但出现另一个错误: not found import org.jxmpp.jid.DomainBareJid;导入 org.jxmpp.jid.parts.Resourcepart;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    • 2012-04-07
    • 2012-09-09
    • 2016-10-26
    • 2011-05-05
    相关资源
    最近更新 更多